簡體   English   中英

元組列表上的Haskell函數

[英]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)]

問題:

  1. 迭代列表中的元組的正確語法是什么?

  2. 您能解釋為什么我同時出現兩個解析器錯誤嗎?

  3. 為什么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

現在,代碼可以編譯,但是出現以下錯誤:

例外:...函數更新中的非窮舉模式

因此,還有其他問題:

  1. 我想找哪種情況?

  2. 是否有可能在編譯時捕獲錯誤(調試/詳細選項無法解決問題)?

您當前正在嘗試對返回值進行迭代,就好像它是一個參數一樣。 您需要先進行遞歸調用, 然后再更新結果

simplify [] = []
simplify (x:xs) = let recursive_result = simplify xs
                      update n pairs = ...
                  in update x recursive_result

where ...是您嘗試查找和替換已經包含x的對或添加新對的地方。

提示:如果您可以說服老師讓您使用它,則內置的lookup功能會有所幫助。

首先,感謝所有受訪者。 我將在此處回答我的所有問題,並在回答的最后提供(擾流器)樣本解決方案。

  1. 迭代列表中的元組的正確語法是什么?

列表不應迭代。 要在這樣的數據結構上編寫函數,

function_name((element1,element2,...,elementN):some_list)= 結果

我的錯誤是我無視列表創建構造函數和函數應用程序的綁定優先級。

  1. 您能解釋為什么我同時出現兩個解析器錯誤嗎?

已經回答了。

  1. 為什么Haskell禁止如下代碼:

由chepner解釋。

  1. 我想找哪種情況?

有1個元素列表的情況。

  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM