2017-12-28 12 views
1

私は質問About `let 5 = 10`を読んでいますが、ここでは何も使っていません。私の例では、ファイルにコードを書いて実行するので、私の質問はまだ答えられません。私のために便利です。バインディングとパターンマッチングを理解する

今日私は[希少パターンマッチング] [1]について同様の質問をしました。私たちの友人は、ハスケルで機能プログラミングの基礎を教えています。彼は今までに見た中で最も珍しいものを書き始めました:

私はkはしませんでした...とても良い、これまで

prelude> x 
10 
prelude> z 
0 
prelude> takeN 3 zs 
[1,2,3] 

:プレリュードで

(x,y) = (10,20) 
(z:zs) = 0 : [1..] 

やショー:彼はとても素晴らしいが、かなりクールではない何かを始め

あなたはそのような値をバインドすることができました

(x,y) = (10,20) 
(z:zs) = 0 : [1..] 
True = False -- HERE 

どうしたのですか?クラス思想のみんな、[OK]を、何かが間違って行くだろうが、いなくてもコンパイルされたコードは、それが実行されます。

prelude> x 
10 
prelude> 4 
4 
prelude> True 
True 
+4

以前に複製としてクローズされていた質問を再入力する場合は、相違点を強調してください。 – leftaroundabout

+0

確かに私はアドバイスのお礼を言います –

+1

正確にはどういう意味ですか –

答えて

3

両方wherelet怠惰パターンを使用して定義式を紹介します。

どのモジュールでも、すべてのトップレベル定義はwhereになります。

module Main where 
     -- ^^^^^ 

x, y :: Int 
(x, y) = undefined 

main :: IO() 
main = putStrLn "hello!" 

上記のプログラムは「hello」を意図したとおりに印刷します。 (x, y)とのパターンマッチングは、厳密であれば分岐しますが、遅延しているためにundefinedの式が評価されることはありません。

GHCiでタイプされた定義は、暗黙的にletの下にあります。

これを知った後、質問に記載されている問題はまさにlet 5 = 10質問の問題です。

1

ハスケルでは、「結合」がパターンマッチングを行っています。 Haskellには正確に2つのタイプのパターンマッチングバインディングがあります。P = xと書くことができます。Pはパターンです。v1 p1 p2 ... pn = xここで、それぞれpiはパターンです。これは、関数v1(の一部)を定義します。パターンとは何ですか? パターンは、vのいずれかの変数で、一致が成功したときに一致するものにはvがバインドされます。あるいは、パターンは、マッチングが行われたときに一致するものが定数と等しい場合にのみ成功する7のような定数であってもよい。または、パターンがデータ型のバリアントである可能性があります。BarのパラメータがFoo p1 p2 ... pnBarのバリアント(コンストラクタ)である場合、piのパターンは、タイプBarのオブジェクトを調べて正常に一致するパターンですそれがFooの変形であり、それぞれがpiのものであれば成功します。

ハスケルは怠惰なので、パターンマッチングを強制する唯一の方法は、パターンマッチングによってバインドされた変数を使うことです。したがって、xの束縛をを使用してlet (x,5)=(6,6)に強制することがあり、これが原因で一致するエラーが発生します。バリアントにパラメータがない場合、マッチングを強制する方法がないため、マッチが失敗する方法はありません。したがって、let True = Falseは、マッチが起こった場合には失敗しますが、マッチを起こす方法がないため、エラーはありません。 Trueを再バインドするのではなく、引数なしのパターンとして使用することに注意してください。

関連する問題