2

私はこことネットで一般的に検索しましたが、この質問に答えていると思われるものは何も見つかりません. 大学のモジュールで Haskell をいじり始めたばかりで、配列の長さを計算する関数 (基本的に既存の長さ関数) を定義する際に問題が発生しています。

私の講義ノートでは、関数は次のように与えられます。

let len [] = 0
let len (h:t) = 1 + len t

これは私には理にかなっています。何も欠けているようには見えず、他の場所でも非常によく似たものが投稿されているのを見たことがありますが、GHCiでは「非網羅的なパターン」エラーがスローされ、一生できません私は理由を理解します。

どんな助けでも大歓迎です、ありがとう

4

1 に答える 1

5

あなたが持っているのは2つの宣言で、2番目は最初の宣言を隠しています。

len2 つの句を持つ 1 つの関数として宣言する必要があります。GHCi では、次のようにできます。

:{
let len [] = 0
    len (h:t) = 1 + len t
:}

この:{ ... :}フォームでは、ファイルと同じように複数行の宣言を入力でき*.hsます。

GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.

Prelude> let len [] = 0
Prelude> let len (h:t) = 1 + len t -- this shadows the earlier len
Prelude> len [1, 2, 3]
*** Exception: <interactive>:3:5-25: Non-exhaustive patterns in function len 
    -- exception because the new len doesn't handle an empty list

Prelude> :{
Prelude| let len [] = 0
Prelude|     len (h:t) = 1 + len t
Prelude| :}
Prelude> len [1, 2, 3]
3
Prelude>
于 2013-10-07T18:29:16.177 に答える