0

Learn You a Haskell から:

このリストについて考えてみましょう: [5]. それは単なる構文糖衣です5:[]。の左側に:値があります。右側にリストがあります。この場合、それは空のリストです。リストは[4,5]どうですか?さて、それは に脱糖し4:(5:[])ます。最初の : を見ると、左側に要素があり、(5:[])右側にリスト , もあります。 のようなリストにも同じことが言えます。これは、そのように、または(右結合であるため)3:(4:(5:6:[]))または のように記述できます。3:4:5:6:[]:[3,4,5,6]

太字の部分については、成長するリストが3:(4:(5:(6:[]))). これは、カリー化、結合性、またはその両方に対する私の理解不足と関係があります。誰かが私の考えの欠陥を教えてもらえますか?

4

3 に答える 3

4

乗算は結合的です。これ(x * y) * zは、 と同じであることを意味しx * (y * z)ます。ただし、:連想しません。

ただし、「左結合」と「右結合」という用語は異なり、「結合」という用語とは無関係です。

  • *が左結合の場合、x * y * zは と同じです(x * y) * z。括弧は冗長です。

  • *が右結合の場合、x * y * zは と同じですx * (y * z)。括弧は冗長です。

カレーはこれとは何の関係もありません。

:は右結合であるため、次の[3,4,5,6]ように記述できます。

3:(4:(5:(6:[])))
3:4:(5:(6:[]))
3:(4:5:(6:[]))
3:4:5:(6:[])
3:(4:(5:6:[]))
3:4:(5:6:[])
3:(4:5:6:[])
3:4:5:6:[]
于 2012-11-30T02:21:53.900 に答える
1

単なるタイプミスです。例には括弧があるはずです(ただし、結合性があるため、括弧がない場合も同じ動作です)。

于 2012-11-30T02:32:52.340 に答える
1
  1. あなたは「私は成長するリストが最高潮に達することを期待していた」と言います3:(4:(5:(6:[])))

    確かにあなたは正しいです。からすべてのシンタックスシュガーを排除したい場合[3,4,5,6]は、3:(4:(5:(6:[])))

  2. あなたはあなたがあなたの質問のコメントで述べているように「本は言う3:(4:(5:6:[]))」という事実に戸惑います。

    繰り返しますが、あなたは正しいです。プレゼンテーションを均一に保つために、そうすべきではありません。これはおそらくタイプミスでした。

Haskellの構文とセマンティクスに関する限り、 。3:(4:(5:6:[]))の代わりに書くことには何の問題もありません3:(4:(5:(6:[])))5:6:[]つまり、それがと同じかどうかという問題です5:(6:[])。右結合性の定義によると、そうです。:正しい連想x:y:z=だからですx:(y:z)

ここにこっけいなメモを追加するだけです。:の右結合性を利用することで(つまり、括弧を使用しないことで)、3:(4:(5:(6:[])))非常に簡潔に書くことができます3:4:5:6:[]。これは、構文的に糖化されたものよりも長い1文字だけ[3,4,5,6]です。

結合性の詳細については、http ://en.wikipedia.org/wiki/Operator_associativityも参照してください。

于 2012-11-30T02:38:04.963 に答える