haskell - 用于交换函数参数的函数类型

标签 haskell types functional-programming

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

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

关于haskell - 用于交换函数参数的函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23376407/

相关文章:

java - 用于 Java 中看起来很奇怪的显式类型参数声明语法

functional-programming - 函数式编程二叉搜索树作业

javascript - Lodash FP 流过滤器 key 未定义

haskell - Parsec,读取以字符串结尾的文本

haskell - 如何使用免费的 monad 实现 Reader?

javascript - 如何在流程中使用带有泛型的对象休息?

python - 我怎样才能 "map"一个字典只改变 Python 中的值

haskell - 在 Haskell 中建立一个列表

haskell - monads current "state of the art"是用纯语言做 IO 吗?

c# - 如何检查 C# 中的两个值是否相等? (给定任何类型的值)