我正好通过Learn You a Haskell书来学习Haskell。直到section on guards,没有任何代码示例缩进,我想知道如何正确地缩进我的Haskell代码。
本书将bmiTell
函数中的保护线缩进四个空格:
bmiTell :: (RealFloat a) => a -> String
bmiTell bmi
| bmi <= 18.5 = "You're underweight, you emo, you!"
| bmi <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!"
| bmi <= 30.0 = "You're fat! Lose some weight, fatty!"
| otherwise = "You're a whale, congratulations!"
Using Haskell Mode's default indentation settings,我可以使用 TAB 和 S-TAB在零空格(产生编译错误)和两个空格(看起来工作正常)之间切换:
bmiTell :: (RealFloat a) => a -> String
bmiTell bmi
| bmi <= 18.5 = "You're underweight, you emo, you!"
| bmi <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!"
| bmi <= 30.0 = "You're fat! Lose some weight, fatty!"
| otherwise = "You're a whale, congratulations!"
The docs让我觉得我不应该在我的Emacs配置中做任何事情来获得推荐的缩进设置,但经过一段谷歌搜索,我还没有找到任何带有两个空格缩进的代码示例。搜索&#34; Haskell风格指南&#34;收益率this,建议使用本书中使用的四维缩进。
Haskell Mode的默认缩进行为是否与人们通常格式化Haskell代码的方式一致?如果没有,我应该如何更改我的Emacs配置以与最流行的缩进方案保持一致?
编辑:显然,我在前面的示例中对缩进不正确。 first use of an if
statement缩进为:
doubleSmallNumber x = if x > 100
then x
else x*2
但在我目前的设置中,我似乎无法使用 TAB 和 S-TAB 获得任何类似的内容。
答案 0 :(得分:1)
您可以查看像parsec这样在haskell中开发的一些主要项目。在parsec的情况下,似乎他们使用four spaces for guards。
答案 1 :(得分:0)
这是我发现有用的东西,并包含在我的init.el
文件(或类似文件)中,用于强制haskell模式每个标签使用四个空格。
(defun haskell-setup ()
(make-local-variable 'tab-stop-list)
(setq tab-stop-list (number-sequence 0 120 4))
(setq indent-line-function 'tab-to-tab-stop)
(setq haskell-indent-spaces 4))
(add-hook 'haskell-mode-hook 'haskell-setup)