Haskell Mode的默认缩进设置是否正常?

时间:2016-05-12 02:15:13

标签: haskell emacs indentation haskell-mode

我正好通过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 获得任何类似的内容。

2 个答案:

答案 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)