[英]Haskell function on list of tuples
任務(家庭作業):給定一個整數列表,返回一個元組列表,其中列表中的每個元組都具有(int_val,val_freq)形式。 不允許使用內置函數。 允許的運算符::,++。
嘗試1:
simplify :: [ Int ] -> [( Int , Int )]
simplify [] = []
simplify ((x:xs) ++ [(a, b)]) =
if x == a then (simplify xs ++ [(x, b + 1)])
else (simplify xs ++ [(x, 0)])
嘗試2:
naive_enumerate :: [ Int ] -> [( Int , Int )]
naive_enumerate [] = []
naive_enumerate x:xs =
if x == y then [(y, 1)] ++ naive_enumerate xs
enumerate_tuple_list :: [( Int , Int )] -> [( Int , Int )]
enumerate_tuple_list [] = []
enumerate_tuple_list ((a, b):(c, d):rest) =
if (a == c) then (a, b+d):(enumerate_tuple_list rest)
else (a, b+d):(enumerate_tuple_list rest)
simplify :: [ Int ] -> [( Int , Int )]
simplify some_list = enumerate_tuple_list (naive_enumerate some_list)
預期的:例如,[[1,2,2,3]的輸入,[(1,1),(2,2),(3,1)]的輸出。 實際結果:在嘗試1中,我遇到了一個錯誤
簡化((x:xs)++ [[a,b)])=
在嘗試2中,我的解析錯誤發生在
enumerate_tuple_list :: [(Int,Int)]-> [(Int,Int)]
問題:
迭代列表中的元組的正確語法是什么?
您能解釋為什么我同時出現兩個解析器錯誤嗎?
為什么Haskell禁止如下代碼:
naive_enumerate x:xs = [(x,1)] ++ naive_enumerate xs
更新:嘗試3:由於到目前為止的建議,我現在有了
simplify :: [ Int ] -> [( Int , Int )]
simplify [] = []
simplify (x:xs) = let recursive_result = simplify xs
update n ((a, b):pairs) =
if n == a then ((a, b + 1):pairs)
else ((n, 1):pairs)
in update x recursive_result
現在,代碼可以編譯,但是出現以下錯誤:
例外:...函數更新中的非窮舉模式
因此,還有其他問題:
我想找哪種情況?
是否有可能在編譯時捕獲錯誤(調試/詳細選項無法解決問題)?
您當前正在嘗試對返回值進行迭代,就好像它是一個參數一樣。 您需要先進行遞歸調用, 然后再更新結果
simplify [] = []
simplify (x:xs) = let recursive_result = simplify xs
update n pairs = ...
in update x recursive_result
where ...
是您嘗試查找和替換已經包含x
的對或添加新對的地方。
提示:如果您可以說服老師讓您使用它,則內置的lookup
功能會有所幫助。
首先,感謝所有受訪者。 我將在此處回答我的所有問題,並在回答的最后提供(擾流器)樣本解決方案。
- 迭代列表中的元組的正確語法是什么?
列表不應迭代。 要在這樣的數據結構上編寫函數,
function_name((element1,element2,...,elementN):some_list)= 結果
我的錯誤是我無視列表創建構造函數和函數應用程序的綁定優先級。
- 您能解釋為什么我同時出現兩個解析器錯誤嗎?
已經回答了。
- 為什么Haskell禁止如下代碼:
由chepner解釋。
- 我想找哪種情況?
有1個元素列表的情況。
- 是否可以在編譯時捕獲錯誤?
通過使用HTF可以實現 。
警鈴提示我的嘗試5 :
simplify :: [ Int ] -> [( Int , Int )]
simplify [] = []
simplify (x:xs) = let recursive_result = simplify xs
update n [] = [(n, 1)]
update n ((a, b):pairs) =
if n == a then ((a, b + 1):pairs)
else (a, b):(update n pairs)
in update x recursive_result
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.