有人可以为Haskell提供良好编码标准的链接吗?我找到了this和this,但它们远非全面。更不用说HaskellWiki包含诸如“谨慎使用类”这样的“宝石”,“定义符号中缀标识符应仅留给图书馆作者。”
答案 0 :(得分:90)
真的很难问。我希望你的答案好转。同时,这里是我在初学者代码中发现的错误或其他令人讨厌的事情的目录。与Kornel Kisielewicz指出的Cal Tech风格页面有一些重叠。我的一些建议与HaskellWiki“宝石”一样模糊和无用,但我希望至少它是更好的建议: - )
格式化代码,使其适合80列。 (高级用户可能更喜欢87或88;除此之外推动它。)
不要忘记let
绑定和where
子句创建一个相互递归的定义嵌套,不 序列定义
利用where
子句,特别是它们能够查看已经在范围内的函数参数(很好的模糊建议)。如果你真的是在使用Haskell,那么你的代码应该有更多where
- 绑定而不是let
- 绑定。太多let
- 绑定是未经重构的ML程序员或Lisp程序员的标志。
避免使用多余的括号。一些冗余括号特别令人反感的地方是
围绕if
表达式中的条件(将您视为未经重构的C程序员)
围绕一个函数应用程序,它本身就是一个中缀运算符的参数(函数应用程序比任何中缀运算符更紧密。这个事实应该烧到每个Haskeller的大脑中,大致相同我们的恐龙让APL的从右到左的扫描规则被烧毁了。)
在中缀运算符周围添加空格。在元组文字中的每个逗号后面加一个空格。
首选函数及其参数之间的空格,即使参数是括号。
明智地使用$
运算符来减少括号。请注意$
和中缀.
之间的密切关系:
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
- 绑定或{{ 1}} - 绑定变量。
答案 1 :(得分:27)
一些良好的拇指规则imho:
Maybe (Maybe a) -> Maybe a
,那么join
就可以做到这一点。replicate :: Int -> a -> [a]
这样的函数,每个参数的作用非常明显,仅从它们的类型开始。isPrefixOf :: (Eq a) => [a] -> [a] -> Bool
,参数的命名/记录更为重要。where
子句中而不是在模块的范围内。zip3
,zipWith3
,zip4
,zipWith4
等功能套件非常简单。使用Applicative
样式代替ZipList
。你可能从未真正需要这些功能。Functor
(只有一种正确的方法可以使类型成为Functor
的实例)。concat :: [[a]] -> [a]
进行编程,请注意它如何更为通用join :: Monad m => m (m a) -> m a
。编程join
时出错的余地较小,因为在编程concat
时,您可以错误地反转列表,在join
中,您可以做的事情很少。readFile
在读取文件时并不真正读取文件的内容。Applicative
表现得像ZipList
,那将会非常混乱/不好。答案 2 :(得分:6)
我建议你看看style checker。
答案 3 :(得分:6)
我想尝试组织功能 作为无点风格的作品 做事尽可能多 像:
func = boo . boppity . bippity . snd
where boo = ...
boppity = ...
bippity = ...
我喜欢使用($)来避免嵌套的parens或长括号表达式
......我以为我还有一些,哦,好吧
答案 4 :(得分:4)
我找到了好的降价文件,几乎涵盖了haskell代码风格的每个方面。它可以用作备忘单。您可以在此处找到它:link