Send Beginners mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://www.haskell.org/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: Recursive update of Records with IO (Alia)
2. Re: Recursive update of Records with IO (Alia)
3. Re: Recursive update of Records with IO (Gnani)
4. help for the lhs2Tex install (kolli kolli)
5. Re: help for the lhs2Tex install (Brandon Allbery)
----------------------------------------------------------------------
Message: 1
Date: Mon, 10 Oct 2011 06:35:29 -0700 (PDT)
From: Alia <[email protected]>
Subject: Re: [Haskell-beginners] Recursive update of Records with IO
To: Daniel Fischer <[email protected]>
Cc: "[email protected]" <[email protected]>
Message-ID:
<[email protected]>
Content-Type: text/plain; charset="us-ascii"
<snip awesome explanation>
Dear Daniel,
I very much appreciate your quick and excellent reply, which is exactly what
the doctor ordered. The revised update works like a charm and I will be
henceforth spending more time in Control.Monad (-:
Many thanks indeed!
Alia
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://www.haskell.org/pipermail/beginners/attachments/20111010/a65e7cef/attachment-0001.htm>
------------------------------
Message: 2
Date: Mon, 10 Oct 2011 06:59:32 -0700 (PDT)
From: Alia <[email protected]>
Subject: Re: [Haskell-beginners] Recursive update of Records with IO
To: "[email protected]" <[email protected]>
Message-ID:
<[email protected]>
Content-Type: text/plain; charset=iso-8859-1
For the sake of good order, I am posting the different solutions as per Daniel
Fischer's suggestions
in a tested module:
<TestIO.hs>
module TestIO
where
import Control.Monad
data Person = Person {name :: String, age :: Int} deriving Show
-- operator version of apply
infix 0 |>
(|>) :: a -> (a -> b) -> b
x |> f = f x
-- verbal version of (|>) operator
apply :: a -> (a -> b) -> b
apply x f = f x
setName :: String -> Person -> IO Person
setName s p = do
??? putStrLn "setting name"
??? return p {name=s}
setAge :: Int -> Person -> IO Person
setAge i p = do
??? putStrLn "setting age"
??? return p {age=i}
-- first way: using recursion
update :: [Person -> IO Person] -> Person -> IO Person
update [] p???? = return p
update (f:fs) p = do
??? p' <- f p
??? update fs p'
-- second way: using foldm and (|>) operator
update1 :: [Person -> IO Person] -> Person -> IO Person
update1 fs p = foldM (|>) p fs
-- third way: (|>) is now function apply
update2 :: [Person -> IO Person] -> Person -> IO Person
update2 fs p = foldM apply p fs
p1 = Person {name="alia", age=12}
p2 = update [(setName "sam"), (setAge 32)] p1
p3 = update1 [(setName "sue"), (setAge 40)] p1
p4 = update2 [(setName "jo"), (setAge 55)] p1
</TestIO.hs>
------------------------------
Message: 3
Date: Mon, 10 Oct 2011 22:43:28 +0800
From: Gnani <[email protected]>
Subject: Re: [Haskell-beginners] Recursive update of Records with IO
To: Daniel Fischer <[email protected]>
Cc: Alia <[email protected]>, "[email protected]"
<[email protected]>
Message-ID: <[email protected]>
Content-Type: text/plain; charset=us-ascii
Daniel,
Excellent explanation. Thanks a lot.
Mohan.
Sent from my iPad
On Oct 10, 2011, at 20:50, Daniel Fischer <[email protected]>
wrote:
> On Monday 10 October 2011, 13:53:17, Alia wrote:
>> Hi folks,
>>
>>
>>
>> (Apologies if there is duplication, I didn't see my post archived so I
>> assumed I had to subscribe to be able to post)
>>
>>
>> In the hope of tapping the collective wisdom, I'd like to share a
>> problem which seems to be worth sharing: how to recursively update a
>> single record instance with a list of IO tainted functions.
>>
>> A simple pure IO-less version of what I am trying to do is probably the
>> best way to explain this:
>>
>> <pure_version>
>>
>> module Test
>>
>> where
>>
>> data Person = Person {name :: String, age :: Int} deriving Show
>>
>> setName :: String -> Person -> Person
>> setName s p = p {name=s}
>>
>> setAge :: Int -> Person -> Person
>> setAge i p = p {age=i}
>>
>> update :: [Person -> Person] -> Person -> Person
>> update [] p = p
>
>> update
>> [f] p = f p
>
> This clause is unnecessary, you can omit it.
>
>> update (f:fs) p = update fs p'
>> where
>> p' = f p
>>
>> p1 = Person {name="sue", age=12}
>> p2 = update [(setName "sam"), (setAge 32)] p1
>>
>> </pure_version>
>>
>> This works very nicely.
>
> Note that update is a special case of a very general pattern, a fold.
> In this case a left fold, since you're combining the functions with the
> person in the order the functions appear in the list.
>
> Prelude> :t foldl
> foldl :: (a -> b -> a) -> a -> [b] -> a
>
> The type of your list elements is b = (Person -> Person),
> the initial value has type a = Person.
>
> So what's missing to use foldl is the function of type
> (a -> b -> a), here (Person -> (Person -> Person) -> Person).
> Now, to combine a Person with a (Person -> Person) function to yield a
> Person, there are two obvious choices,
> 1. const: const p f = p -- obviously not what we want here
> 2. application: app p f = f p -- i.e. app = flip ($).
>
> We can define a pretty operator for that,
>
> infixl 0 |>
>
> (|>) :: a -> (a -> b) -> b
> x |> f = f x
>
> and get
>
> update fs p = foldl (|>) p fs
>
> Note: foldl is almost never what you want, instead you want foldl' from
> Data.List, see e.g.
> http://www.haskell.org/haskellwiki/Foldr_Foldl_Foldl%27
> But it doesn't matter here, as Person is defined, foldl' won't give you
> enough strictness if the list of functions is long; but the list of person-
> updaters will surely be short in general.
>
> For completeness, the type of the right-fold, foldr:
>
> Prelude> :t foldr
> foldr :: (a -> b -> b) -> b -> [a] -> b
>
>>
>> Now if the setter functions involve some IO, I believe the type
>> signatures should probably look like this:
>>
>> setName :: String -> Person -> IO Person
>> setAge :: Int -> Person -> IO Person
>> update :: [Person -> IO Person] -> Person -> IO Person
>>
>> and the setter functions should look like this for example:
>>
>> setName :: String -> Person -> IO Person
>> setName s p = do
>> putStrLn "setting name"
>> return p {name=s}
>>
>> setAge :: Int -> Person -> IO Person
>> setAge i p = do
>> putStrLn "setting age"
>> return p {age=i}
>>
>> but I'm stuck on how
>> the update function would look.. Any help would be much appreciated.
>
> We can closely follow the pure case,
>
> update [] p = return p -- nothing else we could do
> update (f:fs) p = do
> p' <- f p
> update fs p'
>
> The main difference is that instead of binding the updated person with a
> where or let, as in the pure case, we bind it in the IO-monad, since that's
> f's result type.
>
> Instead of coding the recursion ourselves, we can also use a standard
> combinator here,
>
> Prelude Control.Monad> :i foldM
> foldM :: Monad m => (a -> b -> m a) -> a -> [b] -> m a
> -- Defined in Control.Monad
>
> The Monad here is IO, a again is Person, and b is now
> (Person -> IO Person).
>
> For the combinator
> Person -> (Person -> IO Person) -> IO Person
> there are again two obvious possibilities,
> 1. return -- analogous to const
> 2. application, (|>)
>
> and the IO-version becomes
>
> import Control.Monad
>
> update fs p = foldM (|>) p fs
>
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://www.haskell.org/mailman/listinfo/beginners
------------------------------
Message: 4
Date: Mon, 10 Oct 2011 14:24:40 -0600
From: kolli kolli <[email protected]>
Subject: [Haskell-beginners] help for the lhs2Tex install
To: [email protected]
Message-ID:
<cae7d9k55o-n5sirjtuwcm6msihxuehhb9cebfwm_bjg77ro...@mail.gmail.com>
Content-Type: text/plain; charset="iso-8859-1"
hi,
when I am trying to install lhs2tex on my machine(windows).I am getting the
following error.Can you please me install lhs2tex....
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Users\namratha>cabal install lhs2Tex
Resolving dependencies...
[1 of 1] Compiling Main (
C:\Users\namratha\AppData\Local\Temp\lhs2t
ex-1.171640\lhs2tex-1.17\Setup.hs,
C:\Users\namratha\AppData\Local\Temp\lhs2tex-
1.171640\lhs2tex-1.17\dist\setup\Main.o )
Linking
C:\Users\namratha\AppData\Local\Temp\lhs2tex-1.171640\lhs2tex-1.17\dist\
setup\setup.exe ...
Configuring lhs2tex-1.17...
setup.exe: kpsewhich command not found
cabal: Error: some packages failed to install:
lhs2tex-1.17 failed during the configure step. The exception was:
ExitFailure 1
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://www.haskell.org/pipermail/beginners/attachments/20111010/689ce6c4/attachment-0001.htm>
------------------------------
Message: 5
Date: Mon, 10 Oct 2011 16:30:32 -0400
From: Brandon Allbery <[email protected]>
Subject: Re: [Haskell-beginners] help for the lhs2Tex install
To: kolli kolli <[email protected]>
Cc: [email protected]
Message-ID:
<CAKFCL4W4rd1iODz2rr3_jKbfFabn6LE0T=svr0_po2auyp9...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
On Mon, Oct 10, 2011 at 16:24, kolli kolli <[email protected]> wrote:
> when I am trying to install lhs2tex on my machine(windows).I am getting the
> following error.Can you please me install lhs2tex....
>
You need to have a TeX/LaTeX distribution of some kind already installed and
in %PATH%; the installer is looking for kpsewhich, which reports the
location of various TeX library directories.
--
brandon s allbery [email protected]
wandering unix systems administrator (available) (412) 475-9364 vm/sms
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://www.haskell.org/pipermail/beginners/attachments/20111010/3ddb6f20/attachment-0001.htm>
------------------------------
_______________________________________________
Beginners mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/beginners
End of Beginners Digest, Vol 40, Issue 14
*****************************************