在這個運算式中,x 應該比 n 大 1 個單位。但是,結果串列主要由負陣列成。
f :: [Integer]
f = [x-n | x <- [1,2..], n <- [0,1..]]
輸出take 10 f:
[1,0,-1,-2,-3,-4,-5,-6,-7,-8]
我希望它是一個 1 的串列,但我不確定為什么不是這樣。
謝謝。
uj5u.com熱心網友回復:
在您的定義中,對于每個值的x 每個值n都與其配對。例如考慮
g :: [Integer]
g = [ (x, n) | x <- [1,2..4], n <- [0,1..3]]
輸出是
[(1,0),(1,1),(1,2),(1,3),(2,0),(2,1),(2,2),(2,3),(3,0),(3,1),(3,2),(3,3),(4,0),(4,1),(4,2),(4,3)]
如果你想要的元素x,并n通過各自的崗位上被兩兩配對,然后嘗試zip:
f1 = [x-n | (x, n) <- zip [1,2..] [0,1..]]
> take 10 f1
[1,1,1,1,1,1,1,1,1,1]
uj5u.com熱心網友回復:
正如@Willem Van Onsen 在評論中提到的,您的理解相當于一個嵌套回圈,其中 x 上的外回圈永遠不會移動到下一次迭代。因此,對于 n 的每個值,您看到的是 (1 - n)。
您似乎需要的是將兩個串列壓縮在一起,然后進行減法,如下所示:
f = map (\x -> (fst x) - snd x) $ zip [1,2..] [0,1..]
這將成對地從每個串列中獲取元素并進行減法以給出您期望的答案 1。
uj5u.com熱心網友回復:
你給的代碼
f :: [Integer]
f = [x-n | x <- [1,2..], n <- [0,1..]]
是命令式等價于
for x in range(1, inf):
for n in range(0, inf):
return x - n
這么清楚,x是1在第一,然后回圈用于n所有到無窮的方式。所以你得到1 - 0, 1 - 1, 1 - 2, 等等...
根據您的問題,我猜您想將每個串列中的元素一個一個配對,而不是嵌套回圈。因此,代碼應該是
zipWith (-) [1..] [0..] -- this is equal to the infinite list [1,1,1,1,...]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316823.html
標籤:哈斯克尔
下一篇:查找最頻繁元素的函式
