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
。