计算类型Haskell

Jan*_*ski 4 haskell

如何在Haskell中计算(.)(.)的类型?我知道它应该是

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

但如何在没有计算机的情况下计算它

cha*_*ter 8

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


Car*_*ten 5

通过(手动)模式匹配和重写类型变量

(.)有类型(b -> c) -> ((a -> b) -> a -> c)所以第一个参数应该有类型b -> c.现在,如果我们再次使用它,我们必须bb' -> c'c替换(a' -> b') -> a' -> c')(第二个(.)应该有类型(b' -> c') -> ((a' -> b') -> a' -> c')),我们得到

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

这是(重命名后)与上面相同.

请注意,我a -> b -> c = a -> (b -> c)在这里使用

使用GHCi

是的,我知道 - 你想要手工制作 - 但GHCi是一个非常有价值的工具,你真的应该用它来确认你的体力劳动.

在这里从终端:

$ ghci
GHCi, version 7.10.1: http://www.haskell.org/ghc/  :? for help
Prelude> :t (.)(.)
(.)(.) :: (a -> b -> c) -> a -> (a1 -> b) -> a1 -> c
Prelude> 
Run Code Online (Sandbox Code Playgroud)

你可以看到类型是 (a -> b -> c) -> a -> (a1 -> b) -> a1 -> c

顺便说一句::t是简称:type,您可以:help在GHCi会话中查看所有命令.