sách gpt4 ai đã đi

具有两个参数的 Haskell 组合

In lại 作者:行者123 更新时间:2023-12-02 14:35:55 34 4
mua khóa gpt4 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 使用只有一个参数的函数,因此每次函数执行后我们都会返回一个新函数来执行。

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

这将返回另一个函数(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

我不知道我做错了什么。

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

1 Câu trả lời

给定一个函数

add :: Integer -> Integer -> Integer

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

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

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

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

这意味着在表达式中

(.) add

(.)类型中的bSố nguyên,c对应整数 -> 整数。另一种写法是

b ~ Integer
c ~ Integer -> Integer

所以我们得到

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

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

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

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/

34 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com