4

私はプログラミングとHaskellが初めてです。関数の定義方法がわかりません。リスト[b]の位置aにある要素を返す関数が必要だとしましょう。特定の aおよび[b]については、インタープリターでこれを行うことができます。

Prelude> [2, 3, 5, 6] !! 1
Prelude> 3

しかし、インタープリターまたはテキスト エディターで関数を作成しようとすると、次のように問題が発生します。

Prelude> let getElement a [b] = [b] !! a 
Prelude> getElement 1 [2, 3, 5, 6]
***Exception: <interactive>:17:5-27: Non-exhaustive pattern in function getElement
4

1 に答える 1

6

let getElement a [b] = [b] !! a

2 番目のパラメーターは Int であり、パターンは 1 つの要素を持つリストで一致するため、関数はatype の引数を 1 つ取ります。Int(!!)[b]

2 番目のパラメーターがリストであることをコンパイラーに伝えようとしていたようです。これを行うには、通常、型シグネチャを使用します。

ファイル内:

getElement :: Int -> [b] -> b
getElement a bs = bs !! a

このタイプの関数は部分的であると見なされます。整数を指定すると、関数が失敗して例外がスローされる可能性があるためです。たとえば、負の数や、リストよりも大きいインデックスにアクセスしようとする場合などです。実際のHaskellのこの章には、部分関数に関するいくつかの情報があります。プログラミング ガイドライン ページの Haskell wiki にもいくつかのアドバイスがあります

safeパッケージと、それらがheadMayを部分的ではなく完全な実装でどのように定義しているかを確認すること をお勧めします。

編集:以下の Rein Henrichs が推奨するようにb変更されました.bs

于 2013-09-01T23:58:03.120 に答える