我必须将两个作为输入的字符串连接成一个单独的字符串,并将其作为输出放在列表中
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的任何想法?
答案 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]