如何导出(。)的类型。(。)

时间:2014-06-04 05:05:46

标签: haskell

Haskell初学者在这里遇到问题导出(。)。(。) -

的类型
Prelude> :t ((.).(.))
((.).(.)) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c

这就是我的想法:假设(。)。(。)接受两个参数A和B,然后

(.).(.) A B = (.).(A.B)

并假设上面采用了另一个参数C -

(.).(A.B) C = (.)((A.B) C)

将参数D添加到上面 -

(.)((A.B) C) D = ((A.B) C).D

其中D,A,B,A.B和((A.B)C)是(返回)函数,并且 -

D :: a -> b
(A.B) C :: b -> c
A.B :: d -> b -> c
A :: e -> b -> c
B :: d -> e
C :: d

so(。)。(。):: A - > B - > C - > D变成了 -

(.).(.) :: (e -> b -> c) -> (d -> e) -> d -> a -> b

距离正确的类型签名还有几年光。

什么是正确的推导以及我的步骤中出了什么问题?

1 个答案:

答案 0 :(得分:1)

似乎我的错误来自以错误的顺序应用三个点。

学家亚伯拉罕森的answer很棒,但我并没有完全遵循他的步骤 -

((.) (.) (.) :: (b'' -> c'') -> (a' -> b') -> (a' -> c'))
                ^^^^^^^^^^^^    ^^^^^^^^^^ 

由于他"混合"的方式从第二个和第三个点类型中获取第一个和第二个参数。

我想我已经按照我最初的想法得到了答案 -

(.).(.) A = (.)((.) A)) ==> add arg B ==> (.)((.) A)) B = ((.) A).B ==>
add arg C ==> ((.) A).B C = ((.) A)(B C) ==> add arg D ==> ((.) A)(B C) D

其中A,((。)A),(B C)是函数 -

let A :: b -> c
then ((.) A) :: (a -> b) -> a -> c
so B C :: a -> b
B :: a1 -> a -> b
C :: a1
D :: a

和(。)。(。)A B C D扩展为 -

(.).(.) :: (b -> c) -> (a1 -> a -> b) -> a1 -> a -> c