【问题标题】:Couldn't match expected type [Int] Haskell无法匹配预期类型 [Int] Haskell
【发布时间】:2020-12-22 21:33:59
【问题描述】:

我是 Haskell 的新手,所以我不太了解它的大部分错误。我在尝试创建一个使用foldl() 读取列表然后将其乘以2(它会自动反转它)的高阶函数时遇到错误,我使用另一个foldl() 只是为了读取它,所以反转它回到原来的顺序。

如果我得到任何帮助,我将不胜感激。

这是错误

 • Couldn't match expected type ‘[Int]’
                  with actual type ‘t0 Integer -> [Integer]’
    • Probable cause: ‘foldl’ is applied to too few arguments
      In the first argument of ‘reverses’, namely
        ‘(foldl (\ acc x -> (2 * x) : acc) [])’
      In the expression: reverses (foldl (\ acc x -> (2 * x) : acc) [])
      In an equation for ‘multthr’:
          multthr = reverses (foldl (\ acc x -> (2 * x) : acc) [])
   |
16 | multthr = reverses(foldl(\acc x-> (2*x):acc)[])
   |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^

这里是源代码

reverses::[Int] ->[Int]
reverses = foldl(\acc x-> x:acc)[]

multthr::[Int]->([Int]->[Int])
multthr = reverses(foldl(\acc x-> (2*x):acc)[]) 

【问题讨论】:

  • 能否将代码格式化为代码?选择它并按 Ctrl+k
  • 那么考虑一下Probable cause: ‘foldl’ is applied to too few arguments 怎么样?

标签: haskell higher-order-functions fold type-mismatch


【解决方案1】:

您需要使用(.)组合您的两个折叠,而不是将一个应用到另一个:

reverses :: [a] -> [a]
reverses = foldl (\acc x-> x:acc) []

---- multthr :: [Int] -> ([Int] -> [Int])  -- why??
multthr :: [Int] -> [Int]
---- multthr = reverses (foldl(\acc x-> (2*x):acc)[])  -- causes error
multthr = reverses . foldl (\acc x-> (2*x):acc) [] 

所以我们有

> multthr [1..5]
[2,4,6,8,10]
it :: [Int]

(.)是功能组合,定义为(f . g) x = f (g x)

你可以做一个foldr,而不是两个foldl

mult2 = foldr (\x r -> (2*x) : r) []

不过这只是map (2*)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2012-09-14
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多