haskell - 从 `map` 产生 [Int -> Int] 而不是 [Int]
问题描述
我试图将两个复合 lambdas 传递给map
,比如
f::[Int]
f = map ((\_ a->2*a) . (\_ a->a^2)) [1..10]
导致
test.hs:8:5: error:
• Couldn't match type ‘Integer -> Integer’ with ‘Int’
Expected type: [Int]
Actual type: [Integer -> Integer]
• In the expression:
map ((\ _ a -> a + 1) . (\ _ a -> a - 1)) [1 .. 5]
In an equation for ‘f’:
f = map ((\ _ a -> 2*a) . (\ _ a -> a^2)) [1 .. 5]
|
8 | f = map ((\_ a->a+1) . (\_ a->a-1)) [1..5]
解决方案
map
第一个有类型的音符
map :: (a -> b) -> [a] -> [b]
在您的情况下,该参数具有类型
((\_ a->2*a) . (\_ a->a^2)) :: Num b => a -> b -> b
如果我们将这个函数映射到一个列表上,我们会得到一个类似的类型
[b -> b]
(在您的情况下,该列表[1..10]
被假定为类型,[Integer]
因此您得到Actual type: [Integer -> Integer]
.)
但是在函数的签名中f
说它应该是类型[Int]
所以这里出了点问题。我的猜测是你错误地在你的 lambdas 中添加了第二个参数 _
,所以我认为你实际上想写
f = map ((\a->2*a) . (\a->a^2)) [1..10]
请注意,您可以使用运算符部分将其缩短为
f = map ((2*) . (^2)) [1..10]
推荐阅读
- spring-boot - 在没有启动应用程序的情况下在 SpringBoot 中编写单元测试
- flutter - 在 Dart 中使用 await 和 return 有区别吗?
- javascript - 如何从异步函数中获取承诺的价值
- batch-file - 通过更改注册表设置启用 RDP 仅在之前已启用 RDP 多次的情况下才有效
- javascript - 如何将对象转换为数组?
- php - PHPExcel 日期格式
- javascript - 找不到打字稿模块(Vue)和意外的标记@Component
- r - 如何在字符串中查找模式并将其提取为数据框的新列
- debian - apt-get install 后未安装 Wireshark
- ionic-framework - 选择值相同时触发ionChange