5

これが私のコードです:

test :: (Num a) => [a] -> a
test []     = 0
test [x:xs] = x + test xs

しかし、ghci as:l testで実行すると、次のエラーが発生します。

[1/1] Main のコンパイル ( test.hs、解釈済み )

test.hs:3:7:
    Couldn't match type `a' with `[a]'
      `a' is a rigid type variable bound by
          the type signature for spew :: Num a => [a] -> a at test.hs:2:1
    In the pattern: x : xs
    In the pattern: [x : xs]
    In an equation for `spew': spew [x : xs] = x + spew xs
Failed, modules loaded: none.

笑わないように気をつけてください :) Haskell での私の最初の試みです。どんな助けや説明も素晴らしいでしょう。

PS: これは折り畳みで簡単にできることはわかっていますが、独自の型シグネチャを書く練習をしようとしています。前もって感謝します!!

4

2 に答える 2

8

もしかして

test :: (Num a) => [a] -> a
test []     = 0
test (x:xs) = x + test xs -- note round brackets

丸括弧付き。

[x:xs]は 1 つの要素を持つリストであり、それ自体がリスト(x:xs)ですが、 は最初の要素xと末尾を持つリストxsです。

入力length (1:[1,1,1])すると 4 になりますが、入力length [1:[1,1,1]]すると 1 になります。要素はリストだけです。

于 2013-04-23T21:25:16.830 に答える
5

おそらく、リストの最初の要素ではなく、リスト全体を一致させるつもりでした:

test (x:xs) = ...

それ以外の場合、パターンは推定された型[[b]]を持っているため、署名にa == [b]よると、型を持たなければならないので、型だけでなく、の署名によると型も持たなければなりません。これは、矛盾であり、統一につながることを意味します。エラー :)testxs[b]test xsbatesta == [a]

于 2013-04-23T21:25:45.377 に答える