首页 > 解决方案 > 从 `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]

标签: haskelllambda

解决方案


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]

推荐阅读