Send Beginners mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."
Today's Topics:
1. Re: How to parse hetero-list (Baa)
2. how to undertand the function join (*) (=?gb18030?B?UmF5?=)
3. Re: how to undertand the function join (*) (Frerich Raabe)
4. Overlapping instances problem (Baa)
----------------------------------------------------------------------
Message: 1
Date: Thu, 30 Nov 2017 15:03:18 +0200
From: Baa <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] How to parse hetero-list
Message-ID: <20171130150318.59f366cb@Pavel>
Content-Type: text/plain; charset=US-ASCII
Hmm, I done it with:
infixl 9 |||
data a ||| b = A a|B b deriving Show
instance (Read a, Read b) => Read (a ||| b) where
readPrec = parens $ do
a <- (A <$> readPrec) <|> (B <$> readPrec)
return a
so parse looks like:
read "1" :: Int ||| Char ||| String
but I'm not sure is other more classical way to do it...
> Hello, All!
>
> I have types A, B, C... They have instances of class Read, Show,
> SomethingElse, ... I want to keep them as one collection. For example,
> I can use such datatype for it:
>
> data Tags = forall a. Read a => Tags [a]
>
> Now I want to parse "some-string" into A or B or C or ... but without
> to create type's sum of A|B|C|...! All those types have `Read`
> instance but Haskell will not find what instance to use, right? How
> to parse string with alternatives where each alternative returns
> `ReadP A` or `ReadP B`, etc? My intuition is that I should make `x
> <|> y <|> z <|> ...` where x,y,z - parses string into A, B, C, ... so
> they are expressions like `readPrec :: ReadPrec A`, etc. But how to
> pass types into such expression? I must to make expression folding
> (with `<|>`) `readPrec::someType`, where `someType` is item of types
> list `{A, B, C, ...}`
>
> May be it's possible to be done with HList-like types, like: HSet,
> HVect or similar, but I don't know:
>
> - how to iterate/fold over types
> - I'm not sure that HSet/HVect keeps types (like `A ::: B :::
> C ::: ...`)
>
> My idea is to have some function which can parse string into one of
> A|B|C|... with call like:
>
> myParse "some-string" :: (Something A ::: B ::: C ::: D)
>
> (suppose `:::` is type-level "cons"). So, `myParse` is polymorphic and
> it can fold/iterate over type-list items (to call appropriate
> `readPrec`).
>
> Is it even possible?
>
> In languages with reflection I can pass list of types (type - is usual
> value) and call type's methods, but how to solve similar in Haskell?
>
> ===
> Best regards, Paul
------------------------------
Message: 2
Date: Thu, 30 Nov 2017 21:18:46 +0800
From: "=?gb18030?B?UmF5?=" <[email protected]>
To: "=?gb18030?B?YmVnaW5uZXJz?=" <[email protected]>
Subject: [Haskell-beginners] how to undertand the function join
(*)
Message-ID: <[email protected]>
Content-Type: text/plain; charset="gb18030"
Hello Marcus,
what does join (*) do?
(*) :: Num a => a -> a -> a
join (*) :: Num a => a -> a
when we feed a number to join (*),for instance;
λ> : join (*) 3
9
it seems thata join (*) become a square function.
what does join do to (*) to make that happen?
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20171130/3fc65bc3/attachment-0001.html>
------------------------------
Message: 3
Date: Thu, 30 Nov 2017 14:47:37 +0100
From: Frerich Raabe <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] how to undertand the function
join (*)
Message-ID: <[email protected]>
Content-Type: text/plain; charset=UTF-8; format=flowed
On 2017-11-30 14:18, Ray wrote:
> what does JOIN (*) do?
>
> (*) :: Num a => a -> a -> a
>
> join (*) :: Num a => a -> a
>
> when we feed a number to join (*),for instance;
>
> λ> : join (*) 3
>
> 9
>
> it seems thata JOIN (*) become a square function.
>
> what does JOIN do to (*) to make that happen?
You can figure it out by using equational reasoning and evaluating the
expression manually:
join (*) 3
Function application is left-associative, so this is equivalent to
(join (*)) 3
The 'join' function is defined as
(http://hackage.haskell.org/package/base-4.10.0.0/docs/src/GHC.Base.html#join)
join x = x >>= id
So we can replace 'join (*)' in our above expression with
((*) >>= id) 3
(>>=) for functions is defined as
f >>= k = \ r -> k (f r) r
So with that at hand, we get
(\r -> id ((*) r) r) 3
'id x' is just 'x', so we get
(\r -> (*) r r) 3
With infix syntax, this can be written as
(\r -> r * r) 3
If you now apply that function, you get
3 * 3
Which gives your result '9'.
--
Frerich Raabe - [email protected]
www.froglogic.com - Multi-Platform GUI Testing
------------------------------
Message: 4
Date: Fri, 1 Dec 2017 13:57:56 +0200
From: Baa <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: [Haskell-beginners] Overlapping instances problem
Message-ID: <20171201135756.5ac0c43d@Pavel>
Content-Type: text/plain; charset=US-ASCII
Hello, List!
I got error:
Duplicate instance declarations:
instance [overlap ok] EnumTag a => Read a
-- Defined at /XXX/intero/intero2932Xpa-TEMP.hs:110:27
instance [overlap ok] StrTag a => Read a
-- Defined at /XXX/intero/intero2932Xpa-TEMP.hs:121:27 (intero)
For this code:
class (Show a, Enum a) => EnumTag a where
anyEnum :: a
instance {-# OVERLAPS #-} EnumTag a => Read a where
readPrec = RP.lift P.skipSpaces >> expectEnum
instance {-# OVERLAPS #-} EnumTag a => Eq a where
a == b | a == anyEnum || b == anyEnum = True
| otherwise = fromEnum a == fromEnum b
class StrTag a where
anyStr :: a
tagPrefix :: a -> String -- ^ should be constant
toStr :: String -> a
instance {-# OVERLAPS #-} StrTag a => Read a where
readPrec = parens $ do
RP.lift P.skipSpaces
(RP.lift $ expectShown anyStr) <++ RP.lift g
where g = do
Just s@(_:_) <- L.stripPrefix tagPrefix <$> expectTag
return $ toStr s
Why does it happen? `Read a` in 1st instance is valid only when a is
`EnumTag`, in 2nd one - is valid only when a is `StrTag`.
How can I fix this error and to create "default" instances for `EnumTag`
and to `StrTag`, so client code will "inherit" those functionality
(`Read`) simple, only with instantiation of `EnumTag` or `StrTag` ?
Sure, if I comment `instance ... StrTag a` then all work fine, but I need 2
specialized `Read`s (and `Eq`s too :)
===
Best regards, Paul
------------------------------
Subject: Digest Footer
_______________________________________________
Beginners mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
End of Beginners Digest, Vol 114, Issue 1
*****************************************