4

我刚刚开始使用“Learn you a Haskell for Great Good”来学习 Haskell。我目前正在阅读“类型和类型类”一章,所以我的知识相当......不存在。我正在使用带有 SublimeHaskell 包的 Sublime Text 2,它在每次保存时构建/检查文件。

问题:我正在尝试像这样进行函数类型声明:

funcName :: [Char] -> [Char]

我收到这个警告:

警告:使用找到的字符串:[Char] -> [Char] 为什么不使用:String -> String

构建失败

你能向我解释一下为什么使用 Char 数组而不是 String 是一个坏主意吗?或者给我一个链接来解释可能的影响等。我已经用谷歌搜索了,但一无所获。

PS 我是一名 C# 开发人员,我了解类 c 语言中 char 数组和字符串之间的区别。

4

3 回答 3

13

在基础库的某个地方,您会发现这个定义:

type String = [Char]

这说的String[Char]完全一样的东西。您选择的两者中的哪一个是文档选择。我经常这样定义类型别名:

type Domain = ByteString
type UserName = Text

将类型用于文档是一个好主意。

同样作为重要的旁注,[Char]不是字符数组的类型,而是字符列表。因为也有实际的数组类型,所以区别很重要!

于 2013-01-22T23:58:02.280 回答
7

String只不过是 的类型别名[Char],因此两者之间没有实际意义 - 这只是可读性的问题。

于 2013-01-22T23:56:14.177 回答
4

您似乎在您的代码上自动运行 HLint,并将任何 HLint 警告视为致命错误。正如HLint 作者所说“不要盲目地应用 HLint 的输出”。String并且[Char]完全一样,正如大家所说,这是一个看起来更好的问题。String如果我对要视为一个块的连续字符列表进行操作(大多数情况下),我倾向于使用,并且[Char]当字符在运行中组合起来没有意义时(非常罕见)显式使用。HLint 将所有提示分为错误(修复)和警告(思考),因此最好只在错误提示上构建失败。

于 2013-01-23T07:51:13.833 回答