所以我做了这些函数来交换函数的参数

swap1_3 f x y z = f z y x

toFront3 f x y z = f z x y


这些功能如下

foo x y z = [x,y,z]
a = foo 1 2 3 -- returns [1,2,3]
b = swap1_3 foo 1 2 3 -- returns [3,2,1]
c = toFront3 foo 1 2 3 -- returns [3,1,2]


现在,我不理解的是这些函数的类型签名。

类型签名如下

swap1_3 :: (a -> b -> c -> d) -> c -> b -> a -> d

toFront3 :: (a -> b -> c -> d) -> b -> c -> a -> d


从只是看

swap1_3


有人会认为

a corresponds to the type of x
b corresponds to the type of y
c corresponds to the type of z
d corresponds to the return type of f


但是,当您查看下半部分的类型签名时

toFront3


似乎没有对应关系。

那么,这是怎么回事?

最佳答案

有点混乱,但是这样看

f       :: a -> b -> c -> d
f z     ::      b -> c -> d
f z x   ::           c -> d
f z x y ::                d


这意味着

z :: a
x :: b
y :: c


所以,我们有

toFront3
    :: (a -> b -> c -> d)       -- f
    -> b                        -- x
    -> c                        -- y
    -> a                        -- z
toFront3 f x y z = f z x y

10-06 02:45