私は現在、 20 の中級 Haskell 演習に取り組んでいますが、これは非常に楽しい演習です。Functor
これには、型クラスand Monad
(およびFunctor
s とs を引数として取る関数)のさまざまなインスタンスを実装する必要がありますが、andMonad
のようなかわいらしい名前を付けて、実行していることを偽装します (興味深いコードを作成します)。Furry
Misty
私はこれのいくつかをポイントフリー スタイルで実行しようとしてきましたが、ポイントフル (?) 定義をポイントフリー定義に変換するための一般的なスキームがあるかどうか疑問に思いました。たとえば、 の型クラスは次のとおりです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 つの関数では、パラメーターを使用する必要がありました。liftM
fmap
appleTurnover
私の質問は次のとおりです。これらのような定義を無意味な定義に変えるためのレシピはありますか?