我一直在努力学习Haskell,目前正试图制作一个递归的#34;字典"或"翻译"功能。 基本上它应该接收一组stings和一个元组或sting的数组,并返回一个字符串数组,如果它与第一个匹配,则元组替换为元组的第二部分。 所以基本上来自
["a", "b", "zz"] [("a", "11"),("b","c")]
到
["11","c","zz"]
制作麻烦......这是我到目前为止所做的:
aa (x:xs) (y:ys) = do
-- iterate through y
if ys == [] then return(x:xs) else aa (x:xs)(ys)
-- iterate through x
if xs == [] then return(x:xs) else aa (xs)(y:ys);
if x == fst(y)
then do
putStrLn("Yes");
return (snd(y):xs);
else return (x:xs);
适用于数组的第一个元素。 我似乎无法弄清楚如何让它通过。同时删除putStrLn会导致错误"不匹配"括号,为什么?
虽然试图找出它也尝试存储结果,但它没有成功:
aa (x:xs) (y:ys) = do
if x == fst(y)
then result <- snd(y):xs
else result <- x:xs
return result;
导致输入错误&#34;解析错误&#39;&lt; - &#39;也许这应该在“做”中。方框&#34;
答案 0 :(得分:3)
如果我们将其分解,这不是一个难以解决的问题。首先,我们需要一个函数,它接受一个元组列表和一个键,并返回该键存在于列表中的值。
幸运的是,已经为我们定义了lookup
返回Maybe值。如果我们找不到它,那么我们就不需要替换它,所以我们可以简单地返回原始值。 fromMaybe为我们执行此操作,它采用默认值和可能值,如果可能值为Just,则返回just中的值。
现在我们只需要在列表上进行映射,对于每个项目,将其替换为关联列表中的项目(如果存在),如果不存在,则将其替换为自身。
这是代码:
import Data.Maybe (fromMaybe)
translator xs ys = map replace xs
where replace x = fromMaybe x (lookup x ys)
您的代码有一些问题,因为当您不需要时,您似乎尝试使用do notation。当你是初学者时,通常你应该在使用IO的函数中使用do notation。如果你想定义一些东西以防止一切都是长语句,你可以使用where或let。
λ> translator ["a", "b", "zz"] [("a", "11"),("b","c")]
["11","c","zz"]
λ>