有人可以提供指向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
。