2017-08-17 19 views
0

私は式(map . map)のタイプを理解しようとしています。 (.)のタイプは(b -> c) -> (a -> b) -> a -> cなので、mapは関数(b -> c)(a -> b)に適合しない2つの引数を取るので、マップ関数ではどのように動作するのか分かりません。タイプ(地図。地図)

+8

マインド - > B - >(B - - > C)'> C 'が'の略です。 Haskellでは、すべての関数は* one *引数しか取らない。 –

+2

私はそれについて考えていました。しかし、私はそれを 'a - >(b - > c)'または '(a - > b) - > c 'に分けて決定することはできませんでした。しかし、あなたが言うことは今私にとって意味をなさない。私はmapを "one-parameter-function"とみなしたいと思うなら、その型は '(a - > b) - >([a] - > [b])'最初のパラメータ( '(a - > b)'関数)を与えると、返されるのは '([a] - > [b])'型の関数です。 '(a - > b)'と '(a - > [b])'の型は '(a - > b)'の 'a'と' b 'マップ) '? – Nicrophorus

+3

'a - > b - > c'は' a - >(b - > c) 'と同じですが、'(a - > b) - > c 'とは異なります。 – user3927886

答えて

5

引用GHCiの:

Prelude> :t map.map 
map.map :: (a -> b) -> [[a]] -> [[b]] 

しかし、マップ自体のために、タイプがあり、我々が持っている場合は、だから、

map :: (a -> b) -> ([a] -> [b]) 

として見ることができます

map :: (a -> b) -> [a] -> [b] 

その (.) :: (t2 -> t3) -> (t1 -> t2) -> t1 -> t3

その後、

  • タイプt1(a -> b)
  • タイプt2([a] -> [b])
  • タイプt3が、私はそれを考えるのが好き([[a]] -> [[b]])
1

一つの方法は、mapのにa -> bを回すことであるであるです[a] -> [b]ですので、map . mapは2回します。最初のマップはa -> b[a] -> [b]に変え、2番目のマップはプロセスを繰り返して[[a]] -> [[b]]にします。

は、それはかなりかなり論理[a] -> [b]mapを適用する[[a]] -> [[b]]にそれを回すだろうと思える、「a -> bmapを適用すると、[a] -> [b]に変換します」、そう。ファンクションにmapを2回適用するだけです。なお

: `こと

-- apply map to a function once 
      map :: (a -> b) -> ( [a] -> [b] ) 
-- apply map to a function twice 
     map . map :: (a -> b) -> ([[a]] -> [[b]]) 
-- apply map to a function three times 
map . map . map :: (a -> b) -> ([[[a]]] -> [[[b]]])