我有一個元組研究,我想用 Haskell 寫出來。給定 S = {〈x, y〉| 2x y = 7, x ∈B, y ∈B },其中 B = {1, 2.. 20}。我發現答案是 S = {〈1, 5〉,〈2, 3〉,〈3, 1〉}。但是,當我在在線 Haskell 編譯器https://app.codingrooms.com/w/Yr2VJHj0yb9S中輸入它時,我要么得到太多元組,要么得到錯誤訊息Snapshot, Haskell compiler。我嘗試通過分隔 x 和 y 或通過在括號和方括號之間進行更改來更改代碼,但我沒有取得任何成功。有人對我有什么建議嗎?提前致謝!
Haskell 編譯器中的代碼:
b = [1, 2.. 20]
s = [(x,y)|x <- b, y <- b, let 2*x y = 7]
main = do
print s
uj5u.com熱心網友回復:
Yourlet 2*x y = 7實際上是 的縮寫let ( ) (2*x) y = 7,因此您正在重新定義( )函式。但是其中一個引數具有模式(2*x),這不是有效的模式。但即使這樣可行,它也會為整個B×B空間生成元組,所以不是正確的答案。
您可以讓x和y列舉串列B并使用以下內容進行過濾2*x y == 7:
f b = [ (x, y) | x <- b, y <- b, 2*x y == 7 ]
但可能執行成員資格檢查效率更高:
f b = [ (x, y) | x <- b, let y = 7 - 2*x, y `elem` b ]
兩者都產生:
ghci> f [1 .. 20]
[(1,5),(2,3),(3,1)]
uj5u.com熱心網友回復:
要在串列理解中應用過濾,您需要提供謂詞 - 2*x y == 7:
s = [(x,y)|x <- b, y <- b, 2*x y == 7]
不是let您嘗試使用的宣告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507888.html
