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] 追加しようとしていますが、haskell のリストには同じタイプの要素が含まれている必要があるため (それらは同種です)、機能しません。これは、has の型とhasの要素の型が であるためです。[3, 6 .. 1000][5, 10 .. 1000][3, 6 .. 1000][Int][5, 10 .. 1000]Int

あなたが探している++のは、タイプが[a] -> [a] -> [a]あり、リストとxs ++ ysリストの連結であると思います:xsys

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