3

だから私はそれを知っています:

(.) = (f.g) x = f (g x)

そして、その型は (B->C)->(A->B)->A->C ですが、どうですか:

(.)(.) = _? = _?

これはどのように表されますか?私は考えました:

(.)(.) = (f.g)(f.g)x = f(g(f(g x))) // this
(.)(.) = (f.g.h)x = f(g(h x)) // or this

しかし、私がそのタイプを取得しようとした限り、GHCiが私に言ったことは正しくありません。では、両方の「_」は何ですか?

また、関数/演算子$は何をしますか?

4

2 に答える 2

14

まず、あなたはあなたの表記でずさんです。

(.) = (f.g) x = f (g x)  -- this isn't true

何が本当:

(.) f g x = (f.g) x = f (g x)
(.) = \f g x -> f (g x)

そしてその型は

(.) :: (b -> c) -> (a -> b) -> a -> c
       -- n.b. lower case, because they're type *variables*

その間

(.)(.) :: (a -> b -> d) -> a -> (c -> b) -> c -> d
          -- I renamed the variables ghci gave me

さあ、ワークアウトしましょう

(.)(.) = (\f' g' x' -> f' (g' x')) (\f g x -> f (g x))
       = \g' x' -> (\f g x -> f (g x)) (g' x')
       = \g' x' -> \g x -> (g' x') (g x)
       = \f y -> \g x -> (f y) (g x)
       = \f y g x -> f y (g x)
       = \f y g x -> (f y . g) x
       = \f y g -> f y . g

そして($)

($) :: (a -> b) -> a -> b
f $ x = f x

($)単なる関数適用です。ただし、並置による関数適用は優先順位が高いのに対し、関数適用による関数適用($)は優先順位が低くなります。

square $ 1 + 2 * 3 = square (1 + 2 * 3)
square 1 + 2 * 3 = (square 1) + 2 * 3  -- these lines are different
于 2013-04-24T21:33:44.030 に答える