当前位置: 首页 > 知识库问答 >
问题:

双参数Haskell合成

胡星汉
2023-03-14

我试图通过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

我不知道我做错了什么。

你能帮我更多地理解这个错误吗,这样我就可以找到解决方案了?

共有1个答案

令狐运珧
2023-03-14

给定函数

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"

  • 我们从右到左都知道并爱/恨作文: 什么是自然/从左到右组合的“最标准”操作符(如在某种公共库中):