gpt4 book ai didi

haskell - 切换参数顺序的函数的类型是什么?

转载 作者:行者123 更新时间:2023-12-04 23:47:47 25 4
gpt4 key购买 nike

我有一个函数可以简单地切换任何给定函数 f 的两个参数的顺序,如下所示:

flippingArguments f a b = f b a

当我用 :t 检查 flippingArguments 的类型时,我得到以下信息:

flippingArguments :: (t -> t1 -> t2) -> t1 -> t -> t2

我不明白。我会预测以下内容(这是错误的):

flippingArguments :: (t -> t1 -> t2) -> t -> t2 -> t1

也许我误解了如何阅读 Haskell 中的类型规范?我的理解是,第一个括号(t -> t1 -> t2)代表flippingArguments参数,其中t是f,t1是a,t2是b,后面三个t -> t2 -> t1是flippingArguments return只是翻转了 t1 和 t2 的顺序的值。但这是错误的。

我来自 Java,所以如果我不明白这里的返回值是什么,请原谅我,它可能是非常基本的东西。所以重申一下,谁能向我解释一下 flippingArguments 的类型表示法?

最佳答案

以下内容可能会有所帮助:

flippingArguments :: (t -> t1 -> t2) -> t1 -> t -> t2
flippingArguments f a b = f b a

第一个参数 f 的类型为 (t -> t1 -> t2),即它是一个二元函数,它有两个 类型的参数tt1 并返回类型 t2 的值。

那么,第二个参数a的类型是t1

那么,第三个参数b的类型是t

最后,flippingArguments f a b 的结果是 t2 类型。


一个更不言自明的实现可能是:

flippingArguments :: (t -> t1 -> t2) -> (t1 -> t -> t2)
flippingArguments f = \a b -> f b a

这里我们只有一个参数f,与上面的类型相同。结果是一个 lambda,它将 ab 作为输入,并产生预期的结果。

尽管语法不同,但此变体与第一个实现之间没有区别。事实上,多亏了柯里化(Currying),一个函数接受三个参数 f,a,b 并返回一个 t2 类型的值,和仅采用单个参数 f 并返回类型为 t1->t->t2 的函数值的函数。

关于haskell - 切换参数顺序的函数的类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41223473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com