20

McBrideとPatersonの「エフェクトを使用したアプリケーションプログラミング」では、純粋関数を持ち上げるための素敵な構文糖衣を紹介しています。

[| f x y z |]

にとって

f <$> x <*> y <*> z

どこかでli f w x y z ilorを使用している人を思い出します。これは、既存の言語機能ととの狡猾な定義をil f v w x y z li使用して定義できるためかもしれないと思いました。liil

私はこれについての言及を論文以外に見つけることができず、それを仮定して[||]すぐにghcに現れる可能性は低いと仮定して、実装することは可能liですilか?私は彼らにとって賢明なタイプを考えることができないので、私はテンプレートHaskellまたは同様のものが必要だと思いますが、これを達成するのに十分な知識はほとんどありません。[af| f x y ]大丈夫ですが、試してみる前にそれが可能かどうかはわかりません。可能であれば、確かに助けが必要です。

4

3 に答える 3

16

これがあなたが探しているものだと思います。私の記憶が正しければ、haskell-cafeメーリングリストでこのスタイルのアプリケーションアプリケーションに関する議論もありました。

于 2012-08-18T06:53:50.193 に答える
14

これは、 haskell-src-metaパッケージを使用して準引用のHaskell式を解析することにより、テンプレートHaskellに実装するのは非常に簡単です。

{-# LANGUAGE TemplateHaskell #-}

import Language.Haskell.TH
import Language.Haskell.TH.Quote
import Language.Haskell.Meta (parseExp)

import Control.Applicative ((<*>), (<$>))

af = QuasiQuoter
    { quoteExp  = parseAf
    , quotePat  = undefined
    , quoteType = undefined
    , quoteDec  = undefined
    }

parseAf :: String -> Q Exp
parseAf s = case parseExp s of
    Right ex -> applyExp ex
    Left err -> fail err

applyExp :: Exp -> Q Exp
applyExp (AppE f@(AppE _ _) a) = [|$(applyExp f) <*> $(return a)|]
applyExp (AppE f a) = [|$(return f) <$> $(return a)|]
applyExp _ = fail "invalid expression in af"

Template Haskellの仕組みにより、定義されているのと同じファイルから準クォーターを使用することはできないため、上記を独自のモジュールに保存することに注意してください。

GHCiでのテスト

*Main> :set -XTemplateHaskell
*Main> :set -XQuasiQuotes
*Main> [af|(+) (Just 3) (Just 8)|]
Just 11
*Main> [af|(+) (Just 6) Nothing|]
Nothing
于 2012-08-18T06:59:49.213 に答える
8

これに対するTemplateHaskellのアプローチは、Matt Morrowによって書かれ、その後、applicative-quotersパッケージで私によって維持されました。あなたはそれをとして使用するので[i| f x y z |]、それはマクブライドとパターソンの元のアイデアにかなり近いです。

(考えられる欠点:名前iをコードで隠してはいけません。そうしないと、機能しません。個人的には、これがどれほど大きな取引かはわかりません)。

于 2012-08-23T17:07:25.747 に答える