私は現在、 20 の中級 Haskell 演習に取り組んでいますが、これは非常に楽しい演習です。Functorこれには、型クラスand Monad(およびFunctors とs を引数として取る関数)のさまざまなインスタンスを実装する必要がありますが、andMonadのようなかわいらしい名前を付けて、実行していることを偽装します (興味深いコードを作成します)。FurryMisty
私はこれのいくつかをポイントフリー スタイルで実行しようとしてきましたが、ポイントフル (?) 定義をポイントフリー定義に変換するための一般的なスキームがあるかどうか疑問に思いました。たとえば、 の型クラスは次のとおりですMisty。
class Misty m where
unicorn :: a -> m a
banana :: (a -> m b) -> m a -> m b
(関数unicornとbananaはreturnと>>=であり、明らかでない場合に備えて)、これがapple( に相当するflip ap)の実装です。
apple :: (Misty m) => m a -> m (a -> b) -> m b
apple x f = banana (\g -> banana (unicorn . g) x) f
演習の後半ではliftM、liftM2などのバージョンを実装します。私の解決策は次のとおりです。
appleTurnover :: (Misty m) => m (a -> b) -> m a -> m b
appleTurnover = flip apple
banana1 :: (Misty m) => (a -> b) -> m a -> m b
banana1 = appleTurnover . unicorn
banana2 :: (Misty m) => (a -> b -> c) -> m a -> m b -> m c
banana2 f = appleTurnover . banana1 f
banana3 :: (Misty m) => (a -> b -> c -> d) -> m a -> m b -> m c -> m d
banana3 f x = appleTurnover . banana2 f x
banana4 :: (Misty m) => (a -> b -> c -> d -> e) -> m a -> m b -> m c -> m d -> m e
banana4 f x y = appleTurnover . banana3 f x y
さて、 (またはbanana1と同等) の適切な定義により、無意味なスタイルで実装することができました。しかし、他の 3 つの関数では、パラメーターを使用する必要がありました。liftMfmapappleTurnover
私の質問は次のとおりです。これらのような定義を無意味な定義に変えるためのレシピはありますか?