gpt4 book ai didi

具有两个参数的 Haskell 组合

转载 作者:行者123 更新时间:2023-12-02 14:35:55 31 4
gpt4 key购买 nike

我试图通过 Haskell 理解函数式编程,但在处理函数组合时遇到了很多麻烦。

其实我有这两个功能:

add:: Integer -> Integer -> Integer
add x y = x + y

sub:: Integer -> Integer -> Integer
sub x y = x - y

我希望能够创作它们。这没有任何意义,好吧,但这是为了学习目的。

我尝试过的:

foo:: (Integer -> Integer) -> (Integer -> Integer) -> Integer
foo = add . sub

我所理解的:

Haskell 使用只有一个参数的函数,因此每次函数执行后我们都会返回一个新函数来执行。

因此,第一个 Integer 是参数类型,而第二个是必须添加第二个数字的生成函数的返回类型。

这将返回另一个函数(sub),该函数将产生相同的流程(返回带有参数等的函数...)

我说得对吗?

这是我的实际错误代码:

src\Main.hs:23:7:
Couldn't match type `Integer' with `Integer -> Integer'
Expected type: Integer -> (Integer -> Integer) -> Integer
Actual type: Integer -> Integer -> Integer
In the first argument of `(.)', namely `add'
In the expression: add . sub

src\Main.hs:23:13:
Couldn't match type `Integer -> Integer' with `Integer'
Expected type: (Integer -> Integer) -> Integer
Actual type: Integer -> Integer -> Integer
Probable cause: `sub' is applied to too few arguments
In the second argument of `(.)', namely `sub'
In the expression: add . sub

我不知道我做错了什么。

您能否帮助我更多地了解此错误,以便我找到解决方案?

最佳答案

给定一个函数

add :: Integer -> Integer -> Integer

记住(正如您在我的理解部分中指出的那样)类型签名中的 -> 与右侧关联是有用的,即上面的类型是与相同

add :: Integer -> (Integer -> Integer)

现在,考虑 (.) 的类型:

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

这意味着在表达式中

(.) add

(.)类型中的bIntegerc对应整数 -> 整数。另一种写法是

b ~ Integer
c ~ Integer -> Integer

所以我们得到

(.) add :: (a -> Integer) -> a -> (Integer -> Integer)

如果您现在将 (.) add 应用于 sub,编译器会注意到 a -> Integer 无法匹配 >整数->整数->整数

我怀疑您可能希望组合采用三个参数:两个要应用sub,然后结果是 - 与第三个参数一起 -传递给add。因此,组成这两个函数的可能定义是

foo :: (Integer -> Integer -> Integer) -> (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer
foo f g x y = f (g x y) y

无论如何,有一个相关的问题:用一个参数函数组合一个两个参数函数,例如作曲

关于具有两个参数的 Haskell 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34737915/

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