【发布时间】:2019-09-08 20:31:24
【问题描述】:
任务(家庭作业):给定一个整数列表,返回一个元组列表,其中列表中的每个元组都具有 (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
现在代码可以编译了,但出现以下错误:
例外:...函数更新中的非详尽模式
因此附加问题:
我缺少哪些案例?
是否可以在编译时捕获错误(调试/详细选项不起作用)?
【问题讨论】:
-
一个完整的答案将比我现在需要的时间更长(但我相信其他人很快就会提供一个)。但是您在尝试 2 中的解析错误是因为您有一个
if ... then语句而没有else
标签: haskell