我试图通过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使用只有一个arg的函数,因此我们在每次函数执行后返回一个新函数来执行。
因此,第一个整数
是param类型,而第二个是必须添加第二个数字的生成函数的返回类型。
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
b ~ Integer
c ~ Integer -> Integer
(.) add :: (a -> Integer) -> a -> (Integer -> Integer)
我怀疑您可能希望组合包含三个参数:两个用于将sub
应用到其中,然后将其结果连同第三个参数一起传递给add
。因此,组成这两个函数的一个可能的定义是
foo :: (Integer -> Integer -> Integer) -> (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer
foo f g x y = f (g x y) y
值得注意的是,还有一个相关的问题:用一个参数函数组成一个两参数函数,例如组成
函数组合是将一个函数的输出用作另一个函数的输入的过程。在数学中,合成用表示,其中是一个函数,其输出用作另一个函数(即)的输入。 如果一个函数的输出类型与第二个函数的输入类型匹配,则可以使用这两个函数来实现函数组合。我们使用点运算符()在Haskell中实现函数组合。 看下面的示例代码。演示如何使用函数组合来计算输入数字是偶数还是奇数。 在这里,在函数中,同时调用了两个函数和。编译器将首先以作为参数
; ; ; 在2.中,设3。;因此,应为,,替换为1。,为,应为 但是,应该彼此相等,?如何使两者在GHCi中相互适应,它似乎用或代替了,那么它是如何前进的呢?
在JavaScript中,该代码如下所示: 正如您所看到的,函数组合与JavaScript中的链接方法非常相似。我真的很喜欢链接方法从左到右读取的方式。在Haskell中,我可以使用中的函数和反向函数应用程序执行类似的操作,如下所示: 现在我想用点自由样式来写这个函数。使用函数组合,我将把它写如下: 函数组合的美妙之处在于它可以与自身组合,形成如上所示的“高阶函数组合”。因此,尽管它的类型签名直观
本文向大家介绍Haskell合并排序,包括了Haskell合并排序的使用技巧和注意事项,需要的朋友参考一下 示例 有序合并两个有序列表 保留重复项: 自顶向下版本: 定义这种方式是为了清楚而非效率。 使用示例: 结果: 自下而上的版本:
初始化MinIO Client对象。 MinIO-用于公共Play服务器 minioPlayCI :: ConnectInfo minioPlayCI AWS S3 awsCI :: ConnectInfo awsCI { connectAccesskey = "your-access-key" , connectSecretkey = "your-secret-key"
我们从右到左都知道并爱/恨作文: 什么是自然/从左到右组合的“最标准”操作符(如在某种公共库中):