1

有谁知道在 Haskell 中转换形式的方法

["w","o","r","d"]

进入

word

我刚刚完成了我的第一个程序(一个 RSA 加密),现在的输出真的很难看。如果这是一个非常愚蠢的问题,我很抱歉,但我真的不知道该怎么做。另外,为了让我的输入更容易,有谁知道转换的方法

word

进入

[w,o,r,d]
4

4 回答 4

10

即使您从未听说过“concat”,也可以通过以下方式解决此类问题。让我们弄清楚你有什么类型:

λ> :t ["w","o","r","d"]
["w","o","r","d"] :: [[Char]]

好的,这就是 s 的列表Char

现在让我们找出你想要的类型:

λ> :t "word"
"word" :: [Char]

所以我们想要一个函数,将 s 的列表转换为Chars 的简单列表Char。换句话说,我们想要一个带有签名的函数[[Char]] -> [Char]让我们使用Hoogle搜索具有该类型 signature* 的函数。刚才这样做了,列表中的第四个函数是:

concat :: [[a]] -> [a]
base Prelude, base Data.List
Concatenate a list of lists. 

这正是我们想要的。

  • 更好的是,您可能已经意识到我们需要的操作可以对任何类型的列表进行操作。然后您将搜索类型签名[[a]] -> [a]。(这种见识伴随着实践。)我刚才这样做的时候,concat是第一个结果。
于 2013-08-23T13:53:32.747 回答
5

检查类型:

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
于 2013-08-23T12:26:11.177 回答
2

正如其他人所说,concat是将 a[[Char]]转换[Char]为的方式,至于其他方式,您有两种选择。您可以将您的字符串"word"视为Chars 的列表(请记住,它的类型是String,它只是 s 的别名[Char])并且只对Chars 而不是Strings 进行操作,或者您可以将每个单个字符转换为单个字符String。我推荐前者,但我也会演示另一个。

最简单的方法是使用非常简单的列表理解。您所要做的就是从单词中获取每个字母,并将其包装[]成一个列表。因为String = [Char],您将单词的每个字母作为String.

splitUpWord :: String -> [String]
splitUpWord word = [[letter] | letter <- word]
于 2013-08-23T13:43:14.227 回答
1

看看康卡特。您有一个字符列表列表。扁平化这是一种常见的模式,而 concat 是执行此操作的工具。也就是说,如果您正在学习,您可能会自己尝试一下。

于 2013-08-23T12:26:12.173 回答