haskell - haskell 高阶函数中的映射和类型问题
问题描述
我有一个高阶函数如下。F1 只是将 1 添加到第一个元素,但我希望它映射到所有元素,第二个得到类型错误。我想知道如何解决这些问题。'''
hof :: a -> (a->a->a) -> [a] -> a
hof x _ [] = x
hof x f (y:ys) = f y (hof x f ys)
f1 :: (Num a)=> [a] -> a
f1 xs = hof 0 g xs
where g a b = 1 + a
f2 :: [a] -> [a]
f2 (x:xs) = hof [] (++) (x:xs)
预期的行为应该是
f1 [] = 0
f1 x:xs = 1 + f1 xs
f2 [] = []
f2 (x:xs) = x ++ f4 xs
解决方案
g
在第一个版本中f1
不使用b
. 在您hof
对该参数的定义中,递归发生在哪里。如果您不使用该参数,您将不会遍历列表。
至于 的类型错误f2
:仔细看 的类型(++)
,需要的功能hof
和你说的f2
应该有的类型。我怀疑如果你删除你的类型签名,你所拥有的将会编译。然后你可以使用 GHCi 来询问推断的类型f2
。
f2
在测试之前删除模式匹配可能是个好主意。
希望有帮助:)
推荐阅读
- ms-access - 带有嵌套 IIF 语句的文本框控件源无论如何都返回相同的列
- coldfusion - Coldfusion 2016 API Manager 安装问题 - 无法查看管理员
- algorithm - 将一个数分成不同部分的最小数
- arrays - 我的程序不会打印数组中第一个和最后一个数字的总和
- google-sheets - 返回“上次修改”时间
- java - 在布局上绘制画布而不在 UI 上隐藏元素
- c - 如何在 WebKit2GTK 中获取光标下图像的图像标题属性
- javascript - Object 的原型方法只返回函数定义,不执行。
- javascript - EmberJS 组件 - 在 DOM 完全加载后运行自定义函数
- python - odoo 9 py 中的 if else 条件