I will try again to repair my rushing on the code side

I'm interpreting that

[0,0,1] -> False
[0,1,2,1] -> True

To remove the explicit recursion, and noticing the 0 case

any (\(x:xs) -> x `elem` xs) . init . tails . filter (/= 0)  -- quadratic but exit soon

any identity . (zipWith (==) <*> tail) .  sort . filter (/= 0) -- n log n , but has to sort always

I'm not sure, what the other code should do with the accumulated part , as it accumulates duplicates too and forget about the previous boolean

Hope I read it enough carefully  now , to be helpful.

Best







On Wed, 7 Aug 2019 at 13:13, Paolino <paolo.veronelli@gmail.com> wrote:
Pardon, delete my code. I rushed the answer without reading carefully, my bad.


On Wed, 7 Aug 2019 at 13:05, Paolino <paolo.veronelli@gmail.com> wrote:
So about the type error, the second element of the tuple has no defined type. You can fix it substituting (pure v) with [v] if you want a list there.

Also 

- chkDup ns = any (`elem` ns) 
- use Set.member to reduce complexity

Best

On Wed, 7 Aug 2019 at 11:53, Dušan Kolář <kolar@fit.vut.cz> wrote:

Dear Café,

 

I'm trying to solve a couple of examples and exercises just for me. I've come to the point, when I'm trying working code manipulating lists rewrite to work on Foldable (etc.).

 

Nevertheless, I must be doing some mistake, overlooking something, as simple code like this:

 

chkDup [] = False

chkDup (0:ns) = chkDup ns

chkDup (n:ns) = elem n ns || chkDup ns

 

which works fine, type-checks, can be used within other code, I'm trying to replace with more generic, but probably less efficient and wrong code:

 

chkDup ns = fst $ foldr f (False,mempty) ns

where

f _ res@(True,_) = res

f v res@(_,vs) = if v==0 then (False, vs) else (elem v vs, pure v <> vs)

 

which does not even type-check.

 

Nevertheless, the error message is not too helpful, searching the Internet just confirms it's wrong and that adding AllowAmbiguousTypes would not work. The error message is:

 

helper.hs:49:1: error:

• Could not deduce (Foldable f0)

from the context: (Eq a, Num a, Foldable t, Foldable f,

Applicative f, Monoid (f a))

bound by the inferred type for ‘chkDup’:

forall a (t :: * -> *) (f :: * -> *).

(Eq a, Num a, Foldable t, Foldable f, Applicative f,

Monoid (f a)) =>

t a -> Bool

at helper.hs:(49,1)-(53,80)

The type variable ‘f0’ is ambiguous

• In the ambiguity check for the inferred type for ‘chkDup’

To defer the ambiguity check to use sites, enable AllowAmbiguousTypes

When checking the inferred type

chkDup :: forall a (t :: * -> *) (f :: * -> *).

(Eq a, Num a, Foldable t, Foldable f, Applicative f,

Monoid (f a)) =>

t a -> Bool

|

49 | chkDup ns =

| ^^^^^^^^^^^...

 

 

So is there a nicer and working way, how to change my simple example? Is there a way, how to make it compile? Or is it useless to do that, original function is just fine...

 

Best regards,

Dušan

 

_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.


--

Paolo Veronelli (paolo.veronelli@gmail.com)

Functional developer @ global.de


--

Paolo Veronelli (paolo.veronelli@gmail.com)

Functional developer @ global.de


--

Paolo Veronelli (paolo.veronelli@gmail.com)

Functional developer @ global.de