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: Building xmonad / X11 fails on Mac OS X 10.11.3 El
Capitan. (Christoph R. Murauer)
2. Re: ODP: howto Pipe (PICCA Frederic-Emmanuel)
3. to avoid naming intermediate variables (Dennis Raddle)
----------------------------------------------------------------------
Message: 1
Date: Sun, 21 Feb 2016 22:21:41 +0100
From: "Christoph R. Murauer" <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] Building xmonad / X11 fails on Mac OS
X 10.11.3 El Capitan.
Message-ID: <[email protected]>
Content-Type: text/plain; charset=us-ascii
Solved. Documented at the xmonad mailing list.
------------------------------
Message: 2
Date: Mon, 22 Feb 2016 08:39:17 +0000
From: PICCA Frederic-Emmanuel
<[email protected]>
To: "The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell" <[email protected]>
Subject: Re: [Haskell-beginners] ODP: howto Pipe
Message-ID:
<a2a20ec3b8560d408356cac2fc148e53b303b...@sun-dag3.synchrotron-soleil.fr>
Content-Type: text/plain; charset="us-ascii"
> First of all, (StateT Diffractometer (Pipe Engine Geometry IO) ())
> isn't the same as (Pipe Engine Geometry (StateT Diffractometer IO)
> ()), although I'm not sure what exactly the difference will be, as
> I've never used it the former way. This might be again a question for
> the Pipes mailing list.
ok, I will investigate this part :)
> Secondly:
> > but now if I remove the get and put lines, I get the segfault.
> Okay, I have no idea. As I see it, this shouldn't happen, as you're
> getting and putting the same pointer all the time. What if you remove
> the StateT altogether and just use the `dif` from the function
> argument, are you still getting segfaults? Also what about writting
> the function without using pipes, and using Pipes.mapM to make it a
> pipe like I mentioned? (if the only Pipes operation you're doing are
> an `await` in the beginning and a `yield` at the end, Pipes.mapM
> covers it)
Yes I get the segfault if I remove all the State Part and use directly the dif.
I think that I have something like this , I need to connect the life of one
foreignPtr to another one.
This is why I put them all into the Diffractometer data.
But it seems that this is not the magic bullet in order to garanty the same
life time for all of these foreignPtr.
I am wonderig if the fact that I use only one of the ForeignPtr in the
solveTrajPipe function does not give a clu to haskell that he just need to keep
a reference to the used one and get ride of the other one stored in dif.
withDiffractometer :: Diffractometer -> (Ptr HklEngineList -> IO b) -> IO b
withDiffractometer d fun = do
let f_engines = difEngineList d
withForeignPtr f_engines fun
then I extract a pointer from the engines one but as I am using the
withForeingPtr I think that it is ok.
I would say that I am not yet a specialist of FFI and haskell, but I love this
language a lot when I will manage this problem :))
solveTrajPipe' :: Diffractometer -> Pipe Engine Geometry IO ()
solveTrajPipe' dif = flip evalStateT dif $ forever $ do
-- Inside here we are using `StateT Int (Consumer a IO) r`
e <- lift await
-- dif <- get
let name = engineName e
solutions <- lift . lift $ withDiffractometer dif $ \engines ->
withCString name $ \cname -> do
engine <- c_hkl_engine_list_engine_get_by_name engines cname nullPtr
n <- c_hkl_engine_pseudo_axis_names_get engine >>= darrayStringLen
solve' engine n e >>= getSolution0
-- put dif
lift $ yield solutions
Cheers
Frederic
Ps: just for fun I got this adding just a lift print :)
:~/hkl/contrib/haskell$ cabal run
Preprocessing executable 'ghkl' for hkl-0.1.0.0...
[3 of 5] Compiling Hkl.C ( dist/build/ghkl/ghkl-tmp/Hkl/C.hs,
dist/build/ghkl/ghkl-tmp/Hkl/C.p_o )
src/Hkl/C.hsc:125:3:
Couldn't match kind `* -> *' with `*'
Expected type: Diffractometer -> Proxy () Engine () Geometry IO ()
Actual type: Diffractometer -> Proxy () Engine () Geometry IO ()
Kind incompatibility when matching types:
Diffractometer :: * -> *
Diffractometer :: *
The function `lift'ghc: panic! (the 'impossible' happened)
(GHC version 7.6.3 for x86_64-unknown-linux):
kindFunResult ghc-prim:GHC.Prim.*{(w) tc 34d}
Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug
------------------------------
Message: 3
Date: Mon, 22 Feb 2016 00:40:53 -0800
From: Dennis Raddle <[email protected]>
To: Haskell Beginners <[email protected]>
Subject: [Haskell-beginners] to avoid naming intermediate variables
Message-ID:
<CAKxLvoqT6hfgNPRJF1_KSb=+txgmvgnxhfldb_w1ddzxw81...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
I recently realized one important reason Haskell is so compact---it
provides structures that avoid the need to name intermediate variables. I
guess it's obvious, but coming from an imperative background I didn't see
this at first. I am starting to recognize situations where all the existing
wonderful typeclasses assist in eliminating variables.
Function composition is the simplest example. I sometimes write long chains
of composed functions. In an imperative language with a less compact
function call syntax, that would require so many parentheses that you would
probably break it over several statements, then forcing you to use more
variables.
Then I realized that Arrows allow a little more flexibility when you have
different numbers of arguments to feed, say when you split a single
argument into two, or want to construct a function that applies to one
argument and ignores the other.
...So I had to write something like this.
compute :: [Int] -> [Int] -> [Int] -> [(Int,Int)]
func :: [Int] -> [(Int,Int)]
func xs = compute xs (filter isSmall xs) (filter isLarge xs)
but I could also write
compute :: ([Int],([Int],[Int])) -> [(Int,Int)]
func = compute . (id &&& filter isSmall &&& filter isLarge)
So I had to change the inputs to 'compute' into this kind of awkward tuple
form, but I eliminated four 'xs', plus eliminated the need to come up with
the name 'xs'.
Can I get a comment on whether this makes sense as way to do things?
D
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20160222/15f9a64a/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 92, Issue 26
*****************************************