[Haskell-beginners] Providing Haskell Libraries wrapped for other Languages

鲍凯文 traqueofziche at gmail.com
Fri Nov 29 15:11:55 UTC 2019


Hi,

Have you looked into Apache thrift (
https://thrift.apache.org
)? You’d provide interface definitions and the thrift compiler generates
client/server code from those. If the overhead of that is intolerable and
you really want to call functions “directly”, you could try exporting
haskell functions to c and then writing bindings to that for your language,
e.g. using the python c api or JNI. I’m just not sure how one’s supposed to
ensure initialization of the haskell runtime in any case.

Good luck

On Fri, Nov 29, 2019 at 5:00 AM <beginners-request at haskell.org> wrote:

> Send Beginners mailing list submissions to
>         beginners at haskell.org
>
> 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
>         beginners-request at haskell.org
>
> You can reach the person managing the list at
>         beginners-owner at haskell.org
>
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of Beginners digest..."
>
>
> Today's Topics:
>
>    1.  Providing Haskell Libraries wrapped for other    Languages
>       (Leonhard Applis)
>    2. Re:  Providing Haskell Libraries wrapped for      other Languages
>       (Simon Jakobi)
>    3.  strange error inside a case (PICCA Frederic-Emmanuel)
>    4. Re:  strange error inside a case (Sylvain Henry)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Thu, 28 Nov 2019 14:15:27 +0000
> From: Leonhard Applis <Leonhard.Applis at protonmail.com>
> To: "beginners at haskell.org" <beginners at haskell.org>
> Subject: [Haskell-beginners] Providing Haskell Libraries wrapped for
>         other   Languages
> Message-ID:
>
> <GWMEmGPietL5BGMOXNm_vOI1zYWXem1x6GOctodu3ftdJVurBPz36E5Jjq_lzGz7XC4t1CNeY-XajQCrh0j4NKVFXBTTGG4pBmJL6bh4U4s=@
> protonmail.com>
>
> Content-Type: text/plain; charset="utf-8"
>
> Hi,
> I am currently writing a small library. I will provide a small web-api for
> it, however I have some colleagues who neither have experience in haskell,
> nor in web-dev.
> Also they maybe want to produce programs using my library without internet
> / docker / etc.
>
> So in addition I'd like to provide the library "wrapped" for other
> languages, especially python, but maybe java as well.
> These wrappers should do nothing except invoking their pardons on the
> library, and should somewhat contain the library.
>
> What is the common way to do this?
> I've seen "hyphen" as a super heavyweight solution, and I've seen people
> starting the haskell library listening on system-pipes.
> I don't feel that these are the "best" solutions, atleast for my
> intention.
>
> best regards
> Leonhard
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <
> http://mail.haskell.org/pipermail/beginners/attachments/20191128/38f52f24/attachment-0001.html
> >
> -------------- next part --------------
> A non-text attachment was scrubbed...
> Name: publickey - Leonhard.Applis at protonmail.com - 0x807FDDF3.asc
> Type: application/pgp-keys
> Size: 1843 bytes
> Desc: not available
> URL: <
> http://mail.haskell.org/pipermail/beginners/attachments/20191128/38f52f24/attachment-0001.key
> >
> -------------- next part --------------
> A non-text attachment was scrubbed...
> Name: signature.asc
> Type: application/pgp-signature
> Size: 477 bytes
> Desc: OpenPGP digital signature
> URL: <
> http://mail.haskell.org/pipermail/beginners/attachments/20191128/38f52f24/attachment-0001.sig
> >
>
> ------------------------------
>
> Message: 2
> Date: Thu, 28 Nov 2019 16:43:30 +0100
> From: Simon Jakobi <simon.jakobi at googlemail.com>
> To: Leonhard Applis <Leonhard.Applis at protonmail.com>,  The
>         Haskell-Beginners Mailing List - Discussion of primarily
>         beginner-level topics related to Haskell <beginners at haskell.org>
> Subject: Re: [Haskell-beginners] Providing Haskell Libraries wrapped
>         for     other Languages
> Message-ID:
>         <CAGtp2ShEN3HqQb2GAsPniZecStDSkqunUOz=
> tG7oU3TAtRXTAw at mail.gmail.com>
> Content-Type: text/plain; charset="UTF-8"
>
> Hi Leonhard,
>
> I don't have any experience with calling Haskell from other languages
> but I am aware of this project:
>
> https://github.com/nh2/call-haskell-from-anything
>
> I hope it's useful to you.
>
> Cheers,
> Simon
>
> Am Do., 28. Nov. 2019 um 15:15 Uhr schrieb Leonhard Applis
> <Leonhard.Applis at protonmail.com>:
> >
> > Hi,
> >
> > I am currently writing a small library.
> > I will provide a small web-api for it, however I have some colleagues
> who neither have experience in haskell, nor in web-dev.
> > Also they maybe want to produce programs using my library without
> internet / docker / etc.
> >
> > So in addition I'd like to provide the library "wrapped" for other
> languages, especially python, but maybe java as well.
> > These wrappers should do nothing except invoking their pardons on the
> library, and should somewhat contain the library.
> >
> > What is the common way to do this?
> >
> >
> >
> > I've seen "hyphen" as a super heavyweight solution, and I've seen people
> starting the haskell library listening on system-pipes.
> > I don't feel that these are the "best" solutions, atleast for my
> intention.
> >
> > best regards
> > Leonhard
> > _______________________________________________
> > Beginners mailing list
> > Beginners at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
> ------------------------------
>
> Message: 3
> Date: Fri, 29 Nov 2019 10:55:35 +0000
> From: PICCA Frederic-Emmanuel
>         <frederic-emmanuel.picca at synchrotron-soleil.fr>
> To: "The Haskell-Beginners Mailing List - Discussion of primarily
>         beginner-level topics related to Haskell" <beginners at haskell.org>
> Subject: [Haskell-beginners] strange error inside a case
> Message-ID:
>         <
> A2A20EC3B8560D408356CAC2FC148E53017D83AB1A at SUN-DAG3.synchrotron-soleil.fr>
>
> Content-Type: text/plain; charset="Windows-1252"
>
> Hello, I aheve some code whcih look like this
>
> thumbnail' :: (MonadIO m, MonadReader Beamline m, MonadThrow m) =>
> ThumbnailInput -> m ()
> thumbnail' (ThumbnailInput col) = do
>   cwd <- toResultsPath "thumbnail" col
>   let shakeFiles' =  cwd </> $(mkRelDir ".shake/")
>   let shakeReport' = shakeFiles' </> $(mkRelFile "report.html")
>
>   liftIO $ shake shakeOptions{ shakeFiles=fromAbsDir shakeFiles'
>                              , shakeReport=[fromAbsFile shakeReport']
>                              , shakeVerbosity=Diagnostic
>                              } $ do
>     let uploaded = fromAbsFile $ cwd </> $(mkRelFile "thumbnail.uploaded")
>
>     want [uploaded]
>
>     -- (Rule 1) merge the image files
>     uploaded %> \_out -> do
>       -- need [xml]
>       masters <- liftIO $ expectedInputFiles col
>       liftIO $ hdf2mergedcbf' (head masters) 1 1
>       liftIO $ case col of
>         (SomeDataCollection SCollect SHdf5 _)          -> hdf2mergedcbf'
> (head masters) 1 1
>         (SomeDataCollection SCollect SHdf5' _)         -> undefined --
> hdf2mergedcbf' (head masters) 1 1
>         (SomeDataCollection SCaracterization SHdf5 _)  -> undefined
>         (SomeDataCollection SCaracterization SHdf5' _) -> undefined
>         _                                              -> error "show not
> arrive here !!!"
>
>       -- hdf2mergedcbf
>       -- command [] "touch" [uploaded]
>       return ()
>
>
> When I try to compile it, it give me this error
>
>     • Couldn't match type ‘a0’ with ‘()’
>         ‘a0’ is untouchable
>           inside the constraints: f ~ 'ISPyB.DataCollection.Hdf5
>           bound by a pattern with constructor:
>                      SHdf5 :: SCollectSourceFormat
> 'ISPyB.DataCollection.Hdf5,
>                    in a case alternative
>           at src/Thumbnail.hs:180:38-42
>       Expected type: IO a0
>         Actual type: IO ()
>     • In the expression: hdf2mergedcbf' (head masters) 1 1
>       In a case alternative:
>           (SomeDataCollection SCollect SHdf5 _)
>             -> hdf2mergedcbf' (head masters) 1 1
>       In the second argument of ‘($)’, namely
>         ‘case col of
>            (SomeDataCollection SCollect SHdf5 _)
>              -> hdf2mergedcbf' (head masters) 1 1
>            (SomeDataCollection SCollect SHdf5' _) -> undefined
>            (SomeDataCollection SCaracterization SHdf5 _) -> undefined
>            (SomeDataCollection SCaracterization SHdf5' _) -> undefined
>            _ -> error "show not arrive here !!!"’
>     |
> 180 |         (SomeDataCollection SCollect SHdf5 _)          ->
> hdf2mergedcbf' (head masters) 1 1
>     |
>  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
>
> What I do not understand is how to fix this since it seems that
>
>   liftIO $ hdf2mergedcbf' (head masters) 1 1  works out of the case
>
> thanks for your help
>
> Frederic
>
> ------------------------------
>
> Message: 4
> Date: Fri, 29 Nov 2019 12:29:23 +0100
> From: Sylvain Henry <sylvain at haskus.fr>
> To: <beginners at haskell.org>
> Subject: Re: [Haskell-beginners] strange error inside a case
> Message-ID: <7c062774-ff78-569a-fba5-543eccf7cecd at haskus.fr>
> Content-Type: text/plain; charset="utf-8"; format=flowed
>
> Hello,
>
> What is the type of hdf2mergedcbf' ?
>
> Does it work if you write `void (hdf2mergedcbf' (head masters) 1 1)` ?
>
>
> On 29/11/2019 11:55, PICCA Frederic-Emmanuel wrote:
> > Hello, I aheve some code whcih look like this
> >
> > thumbnail' :: (MonadIO m, MonadReader Beamline m, MonadThrow m) =>
> ThumbnailInput -> m ()
> > thumbnail' (ThumbnailInput col) = do
> >    cwd <- toResultsPath "thumbnail" col
> >    let shakeFiles' =  cwd </> $(mkRelDir ".shake/")
> >    let shakeReport' = shakeFiles' </> $(mkRelFile "report.html")
> >
> >    liftIO $ shake shakeOptions{ shakeFiles=fromAbsDir shakeFiles'
> >                               , shakeReport=[fromAbsFile shakeReport']
> >                               , shakeVerbosity=Diagnostic
> >                               } $ do
> >      let uploaded = fromAbsFile $ cwd </> $(mkRelFile
> "thumbnail.uploaded")
> >
> >      want [uploaded]
> >
> >      -- (Rule 1) merge the image files
> >      uploaded %> \_out -> do
> >        -- need [xml]
> >        masters <- liftIO $ expectedInputFiles col
> >        liftIO $ hdf2mergedcbf' (head masters) 1 1
> >        liftIO $ case col of
> >          (SomeDataCollection SCollect SHdf5 _)          ->
> hdf2mergedcbf' (head masters) 1 1
> >          (SomeDataCollection SCollect SHdf5' _)         -> undefined --
> hdf2mergedcbf' (head masters) 1 1
> >          (SomeDataCollection SCaracterization SHdf5 _)  -> undefined
> >          (SomeDataCollection SCaracterization SHdf5' _) -> undefined
> >          _                                              -> error "show
> not arrive here !!!"
> >
> >        -- hdf2mergedcbf
> >        -- command [] "touch" [uploaded]
> >        return ()
> >
> >
> > When I try to compile it, it give me this error
> >
> >      • Couldn't match type ‘a0’ with ‘()’
> >          ‘a0’ is untouchable
> >            inside the constraints: f ~ 'ISPyB.DataCollection.Hdf5
> >            bound by a pattern with constructor:
> >                       SHdf5 :: SCollectSourceFormat
> 'ISPyB.DataCollection.Hdf5,
> >                     in a case alternative
> >            at src/Thumbnail.hs:180:38-42
> >        Expected type: IO a0
> >          Actual type: IO ()
> >      • In the expression: hdf2mergedcbf' (head masters) 1 1
> >        In a case alternative:
> >            (SomeDataCollection SCollect SHdf5 _)
> >              -> hdf2mergedcbf' (head masters) 1 1
> >        In the second argument of ‘($)’, namely
> >          ‘case col of
> >             (SomeDataCollection SCollect SHdf5 _)
> >               -> hdf2mergedcbf' (head masters) 1 1
> >             (SomeDataCollection SCollect SHdf5' _) -> undefined
> >             (SomeDataCollection SCaracterization SHdf5 _) -> undefined
> >             (SomeDataCollection SCaracterization SHdf5' _) -> undefined
> >             _ -> error "show not arrive here !!!"’
> >      |
> > 180 |         (SomeDataCollection SCollect SHdf5 _)          ->
> hdf2mergedcbf' (head masters) 1 1
> >      |
>  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >
> >
> > What I do not understand is how to fix this since it seems that
> >
> >    liftIO $ hdf2mergedcbf' (head masters) 1 1  works out of the case
> >
> > thanks for your help
> >
> > Frederic
> > _______________________________________________
> > Beginners mailing list
> > Beginners at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
> ------------------------------
>
> Subject: Digest Footer
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
> ------------------------------
>
> End of Beginners Digest, Vol 137, Issue 13
> ******************************************
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20191129/7a91214c/attachment-0001.html>


More information about the Beginners mailing list