有人可以提供指向Haskell良好编码标准的链接吗?我已经找到了这个和这个,但是它们远非全面。更不用说HaskellWiki包含诸如“谨慎使用类”和“定义符号中缀标识符应仅留给库作者的”这样的“宝石”。
Answers:
真的很难。希望您的回答对您有所帮助。同时,这是我在初学者代码中发现的错误或其他令人讨厌的东西的目录。Kornel Kisielewicz指向的Cal Tech样式页面有一些重叠。我的一些建议像HaskellWiki的“宝石”一样含糊而无用,但我希望至少它是更好的建议:-)
格式化您的代码,使其适合80列。(高级用户可能更喜欢87或88;除此之外,还可以继续使用。)
不要忘了,let绑定和where条款创建一个定义相互递归窝,不是一个序列的定义。
利用where子句,特别是子句查看范围内的函数参数的能力(含糊的建议)。如果您真的很讨厌Haskell,则代码中的-bindings应该where比-bindings多得多let。太多的let绑定是未重构的ML程序员或Lisp程序员的标志。
避免多余的括号。一些多余的括号特别令人讨厌的地方是
围绕if表达式中的条件(将您称为未经重构的C程序员)
围绕一个函数应用程序本身就是一个infix运算符的参数(Function应用程序比任何infix运算符都绑定得更紧密。这一事实应该被烧入每个Haskeller的大脑,就像我们的恐龙拥有APL从右到左的扫描规则一样烧了。)
在中缀运算符周围放置空格。在元组文字中的每个逗号后面放置一个空格。
即使参数带有括号,也最好在函数及其参数之间留一个空格。
$明智地使用运算符来减少括号。注意$和infix之间的密切关系.:
f $ g $ h x == (f . g . h) x == f . g . h $ x
不要忽略内置Maybe和Either类型。
永远不要写if <expression> then True else False; 正确的短语很简单<expression>。
不要使用head或tail可以使用模式匹配时。
不要用中缀点运算符忽略函数组成。
小心使用换行符。换行符可以提高可读性,但是需要权衡取舍:编辑器一次只能显示40–50行。如果您需要一次阅读和理解一个大型函数,则不要过度使用换行符。
几乎总是喜欢--在行尾添加{- ... -}注释的注释。大括号的注释可能适用于大型标题。
给每个顶级函数一个明确的类型签名。
尽可能对齐相邻行中出现的--行,=符号,甚至括号和逗号。
受GHC中心的影响,我非常喜欢使用camelCase导出的标识符,并在short_name带下划线的本地where绑定或let绑定变量中使用下划线。
(length l) + 1丑陋。应用length自动绑定比的应用程序更严格+,所以惯用的事,可以是length l + 1。括号是功能程序的祸根。
Format your code so it fits in 80 columns.我更喜欢120关口了..什么都没似乎适合在80
一些好的经验法则恕我直言:
Maybe (Maybe a) -> Maybe a,则可以join执行其他操作。replicate :: Int -> a -> [a]这样的函数,很明显每个参数仅从它们的类型起就可以做什么。isPrefixOf :: (Eq a) => [a] -> [a] -> Bool,参数的命名/说明更为重要。where子句中,而不是模块的作用域中。zip3,zipWith3,zip4,zipWith4,等都是非常MEH。改用sApplicative样式ZipList。您可能根本就不需要这些功能。Functor(只有一个做一个类型的实例正确的方式Functor)。concat :: [[a]] -> [a],请注意它如何变得更通用join :: Monad m => m (m a) -> m a。编程join时出错的空间较小,因为在编程时concat您可能会错误地反转列表,并且join您几乎无能为力。readFile在读取文件时并没有真正读取文件的内容。Applicative行为类似于,那将是非常混乱/糟糕的ZipList。