3

我被困在这个问题上,而且我对 Haskell 很陌生,我试图用以下代码完成第一个欧拉问题:

main = putStrLn . show . sum $ [3,6..1000]:[5,10..1000]

这是错误的第一部分:

euler/1.hs:1:19:
    No instance for (Show t0) arising from a use of `show'
    The type variable `t0' is ambiguous
    Possible fix: add a type signature that fixes these type variable(s)
    Note: there are several potential instances:
      instance Show Double -- Defined in `GHC.Float'
      instance Show Float -- Defined in `GHC.Float'
      instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
        -- Defined in `GHC.Real'
      ...plus 23 others
    In the first argument of `(.)', namely `show'
    In the second argument of `(.)', namely `show . sum'
    In the expression: putStrLn . show . sum
4

2 回答 2

6

你期望[3,6..1000]:[5,10..1000]做什么?x : xs将对象准备到对象列表中。这里两个参数都是整数列表。您是否想要++(串联)。

需要说的是,无论您期望:做什么,您的方法都不正确。如果您想自己弄清楚,我不会对此进行扩展。

于 2012-10-23T19:13:53.687 回答
4

不幸的是,您收到的错误消息缺少问题。在 ghci 7.4.2 中加载它会提供更多有用的错误消息:

No instance for (Num [t0])
  arising from a use of `sum'
Possible fix: add an instance declaration for (Num [t0])
In the second argument of `(.)', namely `sum'
In the second argument of `(.)', namely `show . sum'
In the expression: putStrLn . show . sum

No instance for (Enum [t0])
  arising from the arithmetic sequence `5, 10 .. 1000'
Possible fix: add an instance declaration for (Enum [t0])
In the second argument of `(:)', namely `[5, 10 .. 1000]'
In the second argument of `($)', namely
  `[3, 6 .. 1000] : [5, 10 .. 1000]'
In the expression:
  putStrLn . show . sum $ [3, 6 .. 1000] : [5, 10 .. 1000]

这似乎暗示问题出在表达式中[3, 6 .. 1000] : [5, 10 .. 1000],实际上是因为 is 的类型:并且 a -> [a] -> [a]只是x:xs将元素添加x到 list 的开头xs。在[3, 6 .. 1000] : [5, 10 .. 1000] 您尝试将[3, 6 .. 1000]其作为元素添加到 时[5, 10 .. 1000],但 haskell 中的列表必须包含相同类型的元素(它们是同质的),因此这将不起作用。这是因为[3, 6 .. 1000]有 类型[Int]的 元素[5, 10 .. 1000]有 类型Int

我认为您正在寻找的是++具有类型[a] -> [a] -> [a]并且xs ++ ys是列表xs和列表的串联ys

ghci> putStrLn . show . sum $ [3,6..1000] ++ [5,10..1000]
267333
于 2012-10-23T20:40:15.207 回答