列表中字符串的串联

时间:2014-09-17 05:32:01

标签: haskell

我必须将两个作为输入的字符串连接成一个单独的字符串,并将其作为输出放在列表中

type Language = [String]
cat :: Language -> Language -> Language
cat l1 l2  = 
    case l1 of 
    [""] -> l2
    (x:xs) -> case l2 of 
              [""] -> l1
              (y:ys) -> xs ++ ys

,输出应为:

["string1string2"]

haskell的任何想法?

2 个答案:

答案 0 :(得分:5)

鉴于您的确切问题规范,它由

解决
concatWithinLists :: [String] -> [String] -> [String]
concatWithinLists [x] [y] = [x ++ y]

这在各方面都很糟糕。所有这些都源于你的坚持,你只会拥有长度为1的列表,完全忽略了列表的位置。

我强烈建议您重新考虑导致您遇到此问题的所有问题。真正的问题不在这里 - 它在你的设计中更高的位置。只要您对类型系统撒谎了解数据内容,它将继续成为一个问题。您无法与[String]合作,您正在与String合作,并附加了一些噪音,但没有任何好处。

答案 1 :(得分:1)

为什么要在列表中传递字符串?这样做会打开问题,比如代码崩溃应该将空列表作为参数给出(cat [""] []除外)。此外,您的模式匹配已关闭:当单例列表作为参数传递时,xs ++ ys变为[] ++ []。这是因为[x] = x:[]。一个更简单的解决方案是:

cat :: String -> String -> [String]
cat s1 s2 = [s1 ++ s2]