有谁知道在 Haskell 中转换形式的方法
["w","o","r","d"]
进入
word
我刚刚完成了我的第一个程序(一个 RSA 加密),现在的输出真的很难看。如果这是一个非常愚蠢的问题,我很抱歉,但我真的不知道该怎么做。另外,为了让我的输入更容易,有谁知道转换的方法
word
进入
[w,o,r,d]
即使您从未听说过“concat”,也可以通过以下方式解决此类问题。让我们弄清楚你有什么类型:
λ> :t ["w","o","r","d"]
["w","o","r","d"] :: [[Char]]
好的,这就是 s 的列表Char
。
现在让我们找出你想要的类型:
λ> :t "word"
"word" :: [Char]
所以我们想要一个函数,将 s 的列表转换为Char
s 的简单列表Char
。换句话说,我们想要一个带有签名的函数[[Char]] -> [Char]
。让我们使用Hoogle搜索具有该类型 signature* 的函数。刚才这样做了,列表中的第四个函数是:
concat :: [[a]] -> [a]
base Prelude, base Data.List
Concatenate a list of lists.
这正是我们想要的。
[[a]] -> [a]
。(这种见识伴随着实践。)我刚才这样做的时候,concat
是第一个结果。检查类型:
Prelude> let s = ["w","o","r","d"]
Prelude> :t s
s :: [[Char]]
因此,您可以将其视为字符列表的列表。
什么功能“扁平化”列表?连接:
Prelude> :t concat s
concat s :: [Char]
这就是我们的字符串,我们用 putStrLn 打印它
Prelude> putStrLn $ concat s
word
正如其他人所说,concat
是将 a[[Char]]
转换[Char]
为的方式,至于其他方式,您有两种选择。您可以将您的字符串"word"
视为Char
s 的列表(请记住,它的类型是String
,它只是 s 的别名[Char]
)并且只对Char
s 而不是String
s 进行操作,或者您可以将每个单个字符转换为单个字符String
。我推荐前者,但我也会演示另一个。
最简单的方法是使用非常简单的列表理解。您所要做的就是从单词中获取每个字母,并将其包装[]
成一个列表。因为String = [Char]
,您将单词的每个字母作为String
.
splitUpWord :: String -> [String]
splitUpWord word = [[letter] | letter <- word]
看看康卡特。您有一个字符列表列表。扁平化这是一种常见的模式,而 concat 是执行此操作的工具。也就是说,如果您正在学习,您可能会自己尝试一下。