2017-03-02 16 views
-2

誰かが私にこの5に等しい理由を説明することはできますか?どうしてですか?fst(x + 1、(5、x-2)))))))))))))))))))))))))で)xのx = 3をしましょう5

let x = x+3 in fst (snd (x+1,(5,x-2))) 
+5

あなたはそれが同じであるべきと思います、なぜですか? –

+0

これを段階的に計算するには、まず 'snd(a、b)'を 'b'に置き換えてください... – chi

+0

それは他の何かと等しくないのか、それともエラーを生じないのか尋ねていますか? – sepp2k

答えて

3

snd(x+1,(5,x-2))その後、fst(5,x-2)5に等しく、(5,x-2)に等しいです。これらのすべては、xを含む式の評価を必要としません(Haskellは怠惰です、必要なときだけ物事を評価することを意味します)。

7

のは、今のlet x = x + 3 in部分を無視してin後に来るものに焦点を当ててみましょう:

fst (snd (x + 1, (5, x - 2))) 

fstsndの定義はそう括弧で最初

何減少

fst (a, b) = a 
snd (a, b) = b 

された状態で

snd (x + 1, (5, x - 2)) ==> (5, x - 2) 

は今、これはfstに渡されます:

fst (5, x - 2) ==> 5 

だから、最後にxの値が実際に重要ではありません。

これは、レイジー評価と呼ばれるもののためにハスケルで発生する可能性があります。本質的に、コンパイラは必要になるまで値を解決しません。あなたがxを印刷しようとした場合は、これを評価しようとしているメモリを使い果たしたときに定義

x = x + 3 

を使用すると、いくつかの点で無限ループと、おそらくエラーになるだろう。 xの値は決して実際には出力されないので、コンパイラは自由にその値を解決できます。 REPLの式を評価するときにコンソールに出力される値は5です。xの値に依存しないため、xは安全に無視できます。

怠惰なプログラミングを再生するには出番のもう一つの例は、式

> let ones = 1:ones in take 5 ones 
[1,1,1,1,1] 

定義let ones = 1:onesは1Sの無限のリストを定義しているが、我々は唯一のtake 5 onesでそれらの5をつかむために、この式はすることができます解決する。

関連する問題