4

なぜ私はliOfLi代わりに書くことを余儀なくされLiOfLiますか?ご案内ください。

baby.hsのコード

LiOfLi = [[1,3,4,5,6,8]、[12、13、15、16、19、20]、[23、24、25、45、56]]

ghciの応答:

ghci>:l baby
[1/1] Main(baby.hs、interpreted)のコンパイルに
失敗しました。モジュールがロードされました:なし。

ghci> baby.hs:29:1:スコープ外:データコンストラクター `LiOfLi '

頭文字を小文字に変更する場合

baby.hsのコード

liOfLi = [[1,3,4,5,6,8]、[12、13、15、16、19、20]、[23、24、25、45、56]]

ghciの応答:

ghci>:l baby
[1/1] Mainのコンパイル(baby.hs、インタプリタ)
OK、モジュールがロードされました:Main。

以下は私が参照したSOの質問ですが、ルール/ロジックを理解できず、上記の質問に対する回答を得ることができませんでした。

Haskellがデータコンストラクターの最初の文字を大文字にするのはなぜですか?

変数名は小文字である必要があります。これに関連する公式ドキュメントは、haskell.org / onlinereport / intro.html#namespaces –(SOコメントによる) ChrisKuklewiczにあります。

4

3 に答える 3

7

データ コンストラクター (型コンストラクターも) は大文字で始める必要があります。実際にコンパイルされる2番目の例でliOfLiは、データコンストラクターではなく、変数です(小文字で始まります)。

これ:

liOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]

liOfLi変数が と等しいことを宣言します[ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]

一方、これは:

LiOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]

LiOfLi式 に対するpattern のパターン マッチです[ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]。パターンマッチとしては、変数が含まれていないため、まったく役に立たないため、機能したとしても何もしません。パターンが0 引数に適用されLiOfLiたコンストラクターに一致するすべての式を探しているため、コンパイルに失敗します。LiOfLiコンストラクターLiOfLiは、プログラムをコンパイルできない場所で定義されていないためです。

引数なしのコンストラクターにする唯一の方法はLiOfLi、次のように新しい型を導入することです。

data MyNewType = LiOfLi

しかし、リスト型の値であるvalue に対して、type の値のパターンであるLiOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]pattern を一致させようとしているため、まだ機能しません。LiOfLiMyNewType[ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]

基本的に、その方程式は、 の左側の項が=パターンとして解釈されるか変数として解釈されるかによって、2 つの異なることを意味します。Haskell の設計者は、(人間の読者とコンパイラの両方にとって) 与えられた識別子がその最初の文字の大文字と小文字を区別することでコンストラクターなのか変数なのかを常に簡単に判断できるようにすることを選択しました。または変数定義。

于 2012-06-27T03:14:46.337 に答える
2

あなたが書くとき

liOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]

リストのリストによって与えられる値を生成する変数 を定義します。liOfLi対照的に、データ コンストラクターは代数データ型を定義するために使用されます。たとえば、次のデータ型を定義できます。

data Tree a = Nil | Node a (Tree a) (Tree a) 

ここで、NilNodeは両方とも type のデータ コンストラクターですTree a。ghci でそれらの型を確認すると、次のように表示されます。

Node :: a -> Tree a -> Tree a -> Tree a
Nil  :: Tree a
于 2012-06-27T03:11:59.387 に答える
1

Haskell の「データ コンストラクター」は、カスタム型に接続されます。データに特定のコンテキストを与えますが、実際にはデータではありません。型とデータ コンストラクターは大文字にする必要があります。

小文字は、関数または変数の名前を示します。例でその小文字の名前を使用すると、右側のリストに置き換えることができます。

この場合、データ コンストラクターは[](実際には別のものの省略形) です。

于 2012-06-27T03:15:59.373 に答える