【问题标题】:Need help understanding how this Haskell code works需要帮助了解此 Haskell 代码的工作原理
【发布时间】:2021-12-23 07:10:59
【问题描述】:

我正在尝试通过找出一些代码来学习 Haskell 编程语言。

我有这两个小功能,但我不知道如何在 ghci 上测试它们。 调用这些函数时应该使用哪些参数?

total :: (Integer -> Integer) -> Integer -> Integer
total function count = foldr(\x count -> function x + count) 0 [0..count]

上面的函数应该对于给定的值n,返回f 0 + f 1 + ... + f n

但是,在调用该函数时,我不明白在 f 部分中放入什么。 n 只是一个整数,但 f 应该是什么?


iter :: Int -> (a -> a) -> (a -> a)
iter n f
  | n > 0 = f . iter (n-1) f
  | otherwise = id

iter' :: Int -> (a -> a) -> (a -> a)
iter' n = foldr (.) id . replicate n

此函数应该将给定函数f :: a -> a 与自身n :: Integer 次组成,例如iter 2 f = f . f

再次调用函数时,我不明白该放什么而不是 f 作为参数。

【问题讨论】:

  • 在第一个示例中,f 应该是一个接受整数并返回整数的函数。在第二个示例中,f 应该是一个函数,它接受任何类型的参数并返回相同类型的值。
  • total 中使用count 作为输入整数和foldr 的累加器很奇怪。这是故意的吗?
  • 你写的是total吗?有一种更简单的方法来实现它。 (使用mapsum。)

标签: function haskell functional-programming


【解决方案1】:

对于您的第一个问题,您可以为 f 使用任何值,这样

f 0 + f 1 +  ... + f n

确实有道理。您可以使用任何能够接受Integer 参数并返回Integer 值的数值函数,例如(1 +)abssignumerror "error"(\x -> x^3-x^2+5*x-2) 等。

这里的“有意义”意味着生成的表达式具有类型(“typechecks”,在白话中),而不是它会运行而不会导致错误。

对于第二个问题,任何返回与其参数类型相同的值的函数,例如 (1+)(2/) 等。

【讨论】:

  • 当我尝试执行例如 (1+) 的函数时出现错误 * 无法匹配预期类型 Integer' with actual type a0 -> a0' * 在 total', namely ( 1 +)' 在表达式中:total 3 (1 +) 在 `it' 的等式中:it = total 3 (1 +)
  • 你现在可能已经想通了(从你删除问题来看——你真的不应该那样做!)正确的电话是total (1 +) 3。第一个参数是函数,第二个参数是数字,如@9​​87654335@ 的类型(Integer -> Integer) -> Integer -> Integer 所示。 (另外,当发布包含反引号的代码 sn-ps 时,用 double 反引号包围 sn-ps,它会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多