在Haskell函数类型声明中使用[Char]而不是字符串是个坏主意吗
我刚刚开始学习Haskell,用的是“学习Haskell的好处”。 我目前正在阅读“类型和类型类”一章,所以我的知识相当丰富。。不存在。 我正在使用Sublime Text 2和Sublimitehaskell包,该包在每次保存时构建/检查文件 问题是:我试图这样做函数类型声明:在Haskell函数类型声明中使用[Char]而不是字符串是个坏主意吗,haskell,sublimetext2,hlint,Haskell,Sublimetext2,Hlint,我刚刚开始学习Haskell,用的是“学习Haskell的好处”。 我目前正在阅读“类型和类型类”一章,所以我的知识相当丰富。。不存在。 我正在使用Sublime Text 2和Sublimitehaskell包,该包在每次保存时构建/检查文件 问题是:我试图这样做函数类型声明: funcName :: [Char] -> [Char] type Domain = ByteString type UserName = Text 我收到这个警告: 警告:请使用字符串 发现: [Char]
funcName :: [Char] -> [Char]
type Domain = ByteString
type UserName = Text
我收到这个警告:
警告:请使用字符串
发现:
[Char]->[Char]
为什么不:
字符串->字符串
构建失败
你能给我解释一下为什么用字符数组代替字符串是个坏主意,或者给我一个链接来解释可能产生的影响等等。我在谷歌上搜索了一下,什么也没找到
另外,我是一名C#开发人员,我理解类似C语言中字符数组和字符串之间的区别。
String
只不过是[char]
的类型别名,所以两者之间没有实际的区别——这只是可读性的问题。在基本库的某个地方,您可以找到以下定义:
type String = [Char]
也就是说,String
和[Char]
是完全相同的东西。您选择这两个选项中的哪一个是文档选项。我经常这样定义类型别名:
funcName :: [Char] -> [Char]
type Domain = ByteString
type UserName = Text
在文档中使用类型是个好主意
另一个重要的补充说明是,
[Char]
不是字符数组的类型,而是字符列表的类型。因为也有实际的数组类型,所以区别很重要 您似乎在代码上自动运行HLint,并将任何HLint警告视为致命错误。正如“不要盲目应用HLint的输出”String
和[Char]
是完全相同的,正如大家所说,这是一个哪个看起来更好的问题。如果我在连续的字符列表上操作,我想将其视为一个块(大多数情况下),我倾向于使用String
,当字符在一次运行中组合起来没有意义时,我会显式使用[Char]
。HLint将所有提示分为错误(修复)和警告(思考),因此可能最好只构建基于错误的失败提示 [Char]
和String
是一回事。我不知道SublimeHaskell是做什么的,但我猜它正在对您的代码运行某种类型的lint类型检查。从现在开始,我将只使用notepad++和ghci,以减少学习时的噪音。谢谢。作为补充说明,当您更加熟练地使用Haskell时,您应该使用文本
进行认真的编码。它提供了更好的空间效率和性能。懒惰列表是比数据结构更好的控制结构。ST2插件中的规则可能是这一点的产物:感谢使用类型别名添加的额外提示,有时会使以后重构代码更容易。使用类型别名重构函数时,只需在类型签名保持不变的情况下重构实现。