17

Pointfreeをいじっていると、理解できないようなコードが提示されました。

:pl map (\x -> x * x) [1..10]
-- map (join (*)) [1..10]

私の主な問題は、ここでどのように機能するかがわからないことjoinです。モナドラッピングの1つのレイヤーを「削除」することを理解しています(m (m a)to m a)。のようなもの[1..10] >>= (\x -> [x * x])になると思いますが、「余分なレイヤー」がどのように導入されるかはよくわかりません。私はそれを取得しますがjoin x = x >>= id、それが各値を「複製」し(*)て2つの引数を取得する方法にまだこだわっています。これは約30分間私を悩ませてきました.私はすべてのパズルのピースを持っているように感じますが、それらを組み合わせることができないようです.

PS 心配しないでください。私はこの無意味なバージョンを実際には使用しません。これは純粋な好奇心であり、Haskell をよりよく理解しようとする試みです。

4

1 に答える 1

21

joinで定義されているように、 Monadforのインスタンスを使用しています。インスタンスは に似ていますが、明示的なラッパーはありません。次のように定義されます。(->) aControl.Monad.InstancesReader

instance Monad ((->) a) where
  -- return :: b -> (a -> b)
  return = const
  -- (>>=) :: (a -> b) -> (b -> a -> c) -> (a -> c)
  f >>= g = \x -> g (f x) x

このインスタンスを使用して削減joinする場合:

join
(>>= id)
flip (\f g x -> g (f x) x) (\a -> a)
(\f x -> (\a -> a) (f x) x)
(\f x -> f x x)

ご覧のとおり、make のインスタンスは、引数を 2 回適用する関数に(->) aなります。joinこのため、join (*)単に\x -> x * x.

于 2011-07-22T23:58:53.450 に答える