Haskell 列表中字符串的串联

Haskell 列表中字符串的串联,haskell,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 输

我必须把作为输入的两个字符串压缩成一个字符串,并将其作为输出放入列表中

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有什么想法吗?

根据您的确切问题说明,可以通过

concatWithinLists :: [String] -> [String] -> [String]
concatWithinLists [x] [y] = [x ++ y]
这在各方面都是不好的。所有这些都源于你的坚持,你永远只会有长度正好为1的列表,完全忽略了列表的意义


我强烈建议你重新考虑导致这个问题的所有因素。真正的问题不在这里,而是在你的设计中更高的位置。只要你在数据内容方面向类型系统撒谎,这将继续是一个问题。您使用的不是
[String]
,您使用的是
String
,并且附加了一些噪声而没有任何好处。

根据您的确切问题说明,它由

concatWithinLists :: [String] -> [String] -> [String]
concatWithinLists [x] [y] = [x ++ y]
这在各方面都是不好的。所有这些都源于你的坚持,你永远只会有长度正好为1的列表,完全忽略了列表的意义


我强烈建议你重新考虑导致这个问题的所有因素。真正的问题不在这里,而是在你的设计中更高的位置。只要你在数据内容方面向类型系统撒谎,这将继续是一个问题。您没有使用
[String]
,您使用的是
String
,并且附加了一些噪声,但没有任何好处。

为什么要在列表中传递字符串?这样做会带来问题,比如空列表应作为参数提供给代码崩溃(除了
cat[“”][]
)。另外,模式匹配已关闭:
xs++ys
在单例列表作为参数传递时变为
[]+[]
。这是因为
[x]=x:[]
。更简单的解决办法是:

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

为什么要在列表中传递字符串?这样做会带来问题,比如空列表应作为参数提供给代码崩溃(除了
cat[“”][]
)。另外,模式匹配已关闭:
xs++ys
在单例列表作为参数传递时变为
[]+[]
。这是因为
[x]=x:[]
。更简单的解决办法是:

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

我有很多想法。这里有两个:这是严重不够具体的。规格不足的程度和形式表明这是一个XY问题。你到底想做什么?@Carl Language是我定义的字符串语言列表=[string]。我需要连接语言1和语言2。您希望字符串如何连接?例如,给定
[“a”,“b”]
[“c”,“d”]
结果应该是
[“ac”,“bd”]
,或者如果结果是
[“ac”,“ad”,“bc”,“bd”]
?@AaditMShah在列表中,只有一个字符串必须连接到第二个字符串。给定[“a”]和[“b”]结果将是[“ab”]。@mehdix_uuu那么你是说这个问题有大量的输入域约束,你没有费心指定,这些约束非常严重,以至于它们完全否定了正在使用的类型的语义内容?听起来你解决了一个错误的问题。颠覆类型系统很少是个好主意。我有很多想法。这里有两个:这是严重不够具体的。规格不足的程度和形式表明这是一个XY问题。你到底想做什么?@Carl Language是我定义的字符串语言列表=[string]。我需要连接语言1和语言2。您希望字符串如何连接?例如,给定
[“a”,“b”]
[“c”,“d”]
结果应该是
[“ac”,“bd”]
,或者如果结果是
[“ac”,“ad”,“bc”,“bd”]
?@AaditMShah在列表中,只有一个字符串必须连接到第二个字符串。给定[“a”]和[“b”]结果将是[“ab”]。@mehdix_uuu那么你是说这个问题有大量的输入域约束,你没有费心指定,这些约束非常严重,以至于它们完全否定了正在使用的类型的语义内容?听起来你解决了一个错误的问题。颠覆类型系统很少是个好主意。@mehidx_uuz简单地说:如果您希望列表只有一个元素,那么您真的需要使用列表吗?只需声明
type Language=String
@mehidx\uux即可。简单来说,如果您希望列表只有一个元素,那么您真的需要使用列表吗?只需声明
type Language=String