【发布时间】:2013-08-26 11:59:57
【问题描述】:
有没有人知道在 Haskell 中转换形式的方法
["w","o","r","d"]
进入
word
我刚刚完成了我的第一个程序(一个 RSA 加密),现在的输出真的很难看。如果这是一个非常愚蠢的问题,我很抱歉,但我真的不知道该怎么做。另外,为了让我的输入更容易,有谁知道转换的方法
word
进入
[w,o,r,d]
【问题讨论】:
有没有人知道在 Haskell 中转换形式的方法
["w","o","r","d"]
进入
word
我刚刚完成了我的第一个程序(一个 RSA 加密),现在的输出真的很难看。如果这是一个非常愚蠢的问题,我很抱歉,但我真的不知道该怎么做。另外,为了让我的输入更容易,有谁知道转换的方法
word
进入
[w,o,r,d]
【问题讨论】:
即使您从未听说过“concat”,也可以通过以下方法解决此类问题。让我们弄清楚你有什么类型:
λ> :t ["w","o","r","d"]
["w","o","r","d"] :: [[Char]]
好的,这是Chars 的列表。
现在让我们找出你想要的类型:
λ> :t "word"
"word" :: [Char]
所以我们需要一个函数,将Chars 的列表列表转换为Chars 的简单列表。换句话说,我们想要一个签名为[[Char]] -> [Char] 的函数。让我们使用Hoogle 搜索具有该类型签名* 的函数。刚才这样做,列表中的第四个函数是:
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 是将[[Char]] 转换为[Char] 的方式,至于其他方式,您有两种选择。您可以将您的字符串"word" 视为Chars 的列表(请记住,它的类型是String,这只是[Char] 的别名)并且只需在Chars 上操作而不是@987654329 @s,或者您可以将每个单个字符转换为单个字符String。我推荐前者,但我也会演示另一个。
最简单的方法是使用非常简单的列表推导。您所要做的就是从单词中获取每个字母,并将其包装在[] 中以使其成为一个列表。由于String = [Char],您将单词的每个字母作为String。
splitUpWord :: String -> [String]
splitUpWord word = [[letter] | letter <- word]
【讨论】:
splitUpWord = map (:[])。
看看concat。您有一个字符列表列表。展平这是一种常见的模式,而 concat 是执行此操作的工具。也就是说,如果您正在学习,您可能会自己尝试一下。
【讨论】: