Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell函数类型声明中使用[Char]而不是字符串是个坏主意吗_Haskell_Sublimetext2_Hlint - Fatal编程技术网

在Haskell函数类型声明中使用[Char]而不是字符串是个坏主意吗

在Haskell函数类型声明中使用[Char]而不是字符串是个坏主意吗,haskell,sublimetext2,hlint,Haskell,Sublimetext2,Hlint,我刚刚开始学习Haskell,用的是“学习Haskell的好处”。 我目前正在阅读“类型和类型类”一章,所以我的知识相当丰富。。不存在。 我正在使用Sublime Text 2和Sublimitehaskell包,该包在每次保存时构建/检查文件 问题是:我试图这样做函数类型声明: funcName :: [Char] -> [Char] type Domain = ByteString type UserName = Text 我收到这个警告: 警告:请使用字符串 发现: [Char]

我刚刚开始学习Haskell,用的是“学习Haskell的好处”。 我目前正在阅读“类型和类型类”一章,所以我的知识相当丰富。。不存在。 我正在使用Sublime Text 2和Sublimitehaskell包,该包在每次保存时构建/检查文件

问题是:我试图这样做函数类型声明:

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插件中的规则可能是这一点的产物:感谢使用类型别名添加的额外提示,有时会使以后重构代码更容易。使用类型别名重构函数时,只需在类型签名保持不变的情况下重构实现。