Haskell递归字典函数问题

时间:2017-11-07 18:38:10

标签: arrays dictionary haskell recursion

我一直在努力学习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;

1 个答案:

答案 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"]
λ>