假設我們有一個預定義列表pairs
,它是所有對(x,y)的列表,使得x,y∈{1..9}和2x = y。在Haskell它會是什麼樣子:爲什麼生成器會覆蓋Haskell列表理解中的變量值?
pairs = [ (x,y) | x <- [1..9], y <- [1..9], 2 * x == y ]
現在,我想用pairs
定義一個新的列表triplets
,這是所有三胞胎(X,Y,Z),使得列表X,Y,z∈ {1..9},2x = y和2y = z。編寫它的明顯方法是:
triplets = [ (x,y,z) | (x,y) <- pairs, (y,z) <- pairs ]
奇怪的是,這不起作用。
現在,我知道技術爲什麼不:該(y,z) <- pairs
發生器環比(x,y) <- pairs
更加緊密,和值將其分配給y
重寫任何y
是進入該循環之前。但爲什麼你會設計一種語言來做到這一點?它會不會更直觀(並且符合數學約定)讓發電機'看到'它的左邊並重新使用預先指定的值,以便每個變量在每次迭代中都有一個值?我認爲這個設計選擇必須有一個實用的理由,但我不確定它是什麼。
你爲什麼不只是把它寫爲'三胞胎= [(X,Y,Z)| x < - [1..9],y < - [1..9],z < - [1..9]]?? –
@AaditMShah具體來說,OP需要'(x,2 * x,4 * x)'的三元組,它應該返回'[(1,2,4),(2,4,8)]'。 – bheklilr
在這種情況下直接定義更容易,但在使用預先存在的列表更可取的複雜情況下。爲了討論的目的,我只是選擇了一個簡單的例子。 – user3287108