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: A seemingly simple use-case for Template Haskell (Mario Lang)
2. Haskell Platform on OS X, Sierra (Dennis Raddle)
3. Re: Haskell Platform on OS X, Sierra (Dennis Raddle)
4. Why isn't :t (1+1) Integer (Lai Boon Hui)
5. Re: Why isn't :t (1+1) Integer (Alex Belanger)
----------------------------------------------------------------------
Message: 1
Date: Thu, 29 Sep 2016 16:54:13 +0200
From: Mario Lang <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] A seemingly simple use-case for
Template Haskell
Message-ID: <[email protected]>
Content-Type: text/plain; charset=utf-8
Frerich Raabe <[email protected]> writes:
> On 2016-09-28 15:06, Mario Lang wrote:
>> In a small project of mine, I have this basically auto-generated data
>> type:
>>
>> -- Braille music code only uses the old 6-dot system. We enumerate all
>> -- possible dot patterns to use the type system to avoid accidentally
>> -- specifying invalid dot patterns in the source code.
>> --
>> -- gen :: String
>> -- gen =
>> -- "data Braille = " ++ intercalate " | " ctors ++ " deriving
>> (Enum, Eq)" where
>> -- ctors = "NoDots" : map ctorName [1..63] where
>> -- ctorName :: Int -> String
>> -- ctorName = (++) "Dot" . concatMap (show . succ) . flip filter
>> [0..5] . testBit
>>
>> data SixDots = NoDots | Dot1 | Dot2 | Dot12 | Dot3 | Dot13 | Dot23 | Dot123
>> | Dot4 | Dot14 | Dot24 | Dot124 | Dot34 | Dot134 | Dot234
>> | Dot1234 | Dot5 | Dot15 | Dot25 | Dot125 | Dot35 | Dot135
>> | Dot235 | Dot1235 | Dot45 | Dot145 | Dot245 | Dot1245 | Dot345
>> | Dot1345 | Dot2345 | Dot12345 | Dot6 | Dot16 | Dot26 | Dot126
>> | Dot36 | Dot136 | Dot236 | Dot1236 | Dot46 | Dot146 | Dot246
>> | Dot1246 | Dot346 | Dot1346 | Dot2346 | Dot12346 | Dot56 |
>> Dot156
>> | Dot256 | Dot1256 | Dot356 | Dot1356 | Dot2356 | Dot12356
>> | Dot456 | Dot1456 | Dot2456 | Dot12456 | Dot3456 | Dot13456
>> | Dot23456 | Dot123456
>> deriving (Bounded, Enum, Eq, Read, Show)
>>
>> So, while actually quite simple, this looks like an opportunity to use
>> Template Haskell for me. In other words, I want to figure out what is
>> necessary to generate this data type with TH, instead of the gen
>> function that basically generates a piece of plain Haskell code.
>
> Here's one way to do it (the 'ctorNames' definition is copied out of
> your comment):
>
> --- Mario.hs ---
> module Mario (makeDotsType) where
>
> import Data.Bits (testBit)
> import Language.Haskell.TH
>
> ctorNames :: [String]
> ctorNames = "NoDots" : map ctorName [1..63]
> where
> ctorName :: Int -> String
> ctorName = (++) "Dot" . concatMap (show . succ) . flip filter
> [0..5] . testBit
>
> makeDotsType :: Q [Dec]
> makeDotsType = do
> let ctors = map (\n -> NormalC (mkName n) []) ctorNames
> let instances = map mkName ["Bounded", "Enum", "Eq", "Read", "Show"]
> return [DataD [] (mkName "SixDots") [] ctors instances]
> ---
>
> --- Main.hs ---
> {-# LANGUAGE TemplateHaskell #-}
>
> import Mario
>
> $(makeDotsType)
> ---
>
> If you compile this with
>
> $ ghc -ddump-splices Main.hs
>
> You can see what type definition that '$(makeDotsType)' expands to.
Oh, thank you! It could have been so simple...
> For what it's worth, this may not compile with all versions of the TH
> support in GHC; I wrote the above code using GHC 7.10.2.
Works here.
> In general, I find -ddump-splices invaluable when using TH. I use it
> every minute or so to see what code I'm currently generating. What's
> noteworthy is that (as mentioned in the 'Using Template Haskell'
> section of the GHC user guide) that
>
> You can only run a function at compile time if it is imported from
> another module. That is, you can't define
> a function in a module, and call it from within a splice in the same
> module.
>
> That's why I used a separate 'Mario' module above.
Yes, I was aware of the need to put the function in a different module.
Thanks again, a working example is really nice to play with.
--
CYa,
⡍⠁⠗⠊⠕
------------------------------
Message: 2
Date: Thu, 29 Sep 2016 13:35:49 -0700
From: Dennis Raddle <[email protected]>
To: Haskell Beginners <[email protected]>
Subject: [Haskell-beginners] Haskell Platform on OS X, Sierra
Message-ID:
<cakxlvormqd2sedvu6z2lgarb1r-y9dz2wz4rtt2kcck9tj-...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
I have been running the Haskell Platform on OS X El Capitan for a few
months. I just upgraded to Sierra and I notice it broke something. For
instance when I run ghci I get
xcrun: error: invalid active developer path ... missing xcrun ....
What's the best way to recover? Should I uninstall and reinstall Haskell
Platform?
BTW, how DO you uninstall the Haskell Platform on OS X?
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20160929/78a09350/attachment-0001.html>
------------------------------
Message: 3
Date: Thu, 29 Sep 2016 14:10:52 -0700
From: Dennis Raddle <[email protected]>
To: Haskell Beginners <[email protected]>
Subject: Re: [Haskell-beginners] Haskell Platform on OS X, Sierra
Message-ID:
<CAKxLvoqbpKOo-=538BjmRqyE8-K7jkvsLgi=lpgu7gmay4a...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
Solved, I think. I think the fix is to install the command-line developer
tools.
On Thu, Sep 29, 2016 at 1:35 PM, Dennis Raddle <[email protected]>
wrote:
> I have been running the Haskell Platform on OS X El Capitan for a few
> months. I just upgraded to Sierra and I notice it broke something. For
> instance when I run ghci I get
>
> xcrun: error: invalid active developer path ... missing xcrun ....
>
> What's the best way to recover? Should I uninstall and reinstall Haskell
> Platform?
>
> BTW, how DO you uninstall the Haskell Platform on OS X?
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20160929/2ca3601a/attachment-0001.html>
------------------------------
Message: 4
Date: Fri, 30 Sep 2016 07:48:32 +0800
From: Lai Boon Hui <[email protected]>
To: [email protected]
Subject: [Haskell-beginners] Why isn't :t (1+1) Integer
Message-ID:
<CAJdQgg=d185rvrQgQ14EyKPRFrNQSBkfesF0Yf6Re=Xk5dqH=q...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
Hi,
i read that the default type for Num is Integer.
If we specify a type for one of the arguments:
:t (1 + 1::Double) is Double
If we don't, i expect the default type for Num to come into play:
However :t (1 + 1) is Num a => a
Why is that so?
--
Best Regards,
Boon Hui
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20160930/a8b18910/attachment-0001.html>
------------------------------
Message: 5
Date: Thu, 29 Sep 2016 23:47:17 -0400
From: Alex Belanger <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] Why isn't :t (1+1) Integer
Message-ID:
<cadsky2y-pla6ircgtf5m5azf9qjn_65sccq_+mtgxdxpk+n...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
Those are not demonstrations of the defaulting rules in action though.
As far as I know, :t is agnostic to those and will keep showing the
original polymorphic version, since you're not in a context where GHC has
to sacrifice the polymorphic type and commit to a monomorphic one using a
default, like when expressions are evaluated.
Also I think that's effective just for the REPL (it uses extended
defaulting rules that are more lax) and is done for convenience. If it was
during a GHC build, you'd get loud warning when something is defaulted.
Try `reverse []` for fun vs. `:t reverse []`.
On Sep 29, 2016 7:48 PM, "Lai Boon Hui" <[email protected]> wrote:
> Hi,
> i read that the default type for Num is Integer.
> If we specify a type for one of the arguments:
> :t (1 + 1::Double) is Double
>
> If we don't, i expect the default type for Num to come into play:
> However :t (1 + 1) is Num a => a
>
> Why is that so?
>
> --
> Best Regards,
> Boon Hui
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20160929/bd50ac7f/attachment-0001.html>
------------------------------
Subject: Digest Footer
_______________________________________________
Beginners mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
End of Beginners Digest, Vol 99, Issue 23
*****************************************