为什么(.)地图有这种类型?

joe*_*err 3 haskell types

我试图找到函数的类型,(.) map但不知何故发现它((a -> d) -> (a -> e)) -> ([d] -> [e])根据GHCI是不正确的,因为它应该是(.) map :: (a1 -> a2 -> b) -> a1 -> [a2] -> [b].

我究竟做错了什么?

Wil*_*sem 6

派生类型......

我们有成分:

(.) :: (b -> c) -> (a -> b) -> a -> c
map :: (d -> e) -> [d] -> [e]
Run Code Online (Sandbox Code Playgroud)

(这里我为这两个函数使用了不同的类型标识符,以避免任何混淆).一个更详细的形式(我们使其更明确,每个函数只接受一个参数)是:

(.) :: (b -> c) -> ((a -> b) -> (a -> c))
map :: (d -> e) -> ([d] -> [e])
Run Code Online (Sandbox Code Playgroud)

因为这map是第一个参数,(.)这意味着它的类型(d -> e) -> ([d] -> [e])应该与(.)函数的输入类型匹配(所以b -> c).这意味着:

  b        -> c
~ (d -> e) -> ([d] -> [e])
------------------------------
b ~ (d -> e), c ~ ([d] -> [e])
Run Code Online (Sandbox Code Playgroud)

这意味着结果类型(.) map是:

(a -> b) -> (a -> c)
Run Code Online (Sandbox Code Playgroud)

这相当于:

(a -> (d -> e)) -> (a -> ([d] -> [e]))
Run Code Online (Sandbox Code Playgroud)

或者更简洁:

(.) map :: (a -> d -> e) -> a -> [d] -> [e]
Run Code Online (Sandbox Code Playgroud)

......及其实施

(.)功能可以看作(.) f g == \x -> f (g x).这意味着我们的功能

h = (.) map
Run Code Online (Sandbox Code Playgroud)

相当于:

h f x = map (f x)
Run Code Online (Sandbox Code Playgroud)

因此,它作为输入的函数f和对象x,并且比执行mapf x作为功能.

从某种程度上说,你可以说我们制作了一个" 地图,其中一个人必须注入类型的'竞赛' - 目标 " a.然后处理器考虑该上下文.如果我们想要应用多个maps,每个都有一个小的变化,因此首先传递"context-object",这可能很有用.这当然对人类解释.对于编译器,x可以有任何使用,解释等.