3

我正在通过《Learn You a Haskell》这本书来学习 Haskell。直到关于 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!"

使用 Haskell 模式的默认缩进设置TAB,我可以使用and在零空格(这会产生编译错误)和两个空格(似乎工作正常)之间切换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!"

这些文档看起来好像我不需要在我的 Emacs 配置中做任何事情来获得推荐的缩进设置,但是经过一番谷歌搜索后,我无法找到任何带有两个空格缩进的代码示例。搜索“Haskell 风格指南”会得到这个,它推荐像书中使用的那样使用四空格缩进。

Haskell 模式的默认缩进行为是否与人们通常格式化 Haskell 代码的方式一致?如果不是,我应该如何更改我的 Emacs 配置以与最流行的缩进方案保持一致?

编辑:显然,我在前面的例子中关于缩进是不正确的。语句第一次使用if缩进如下:

doubleSmallNumber x = if x > 100
                        then x
                        else x*2

但在我当前的设置中,我似乎无法得到任何看起来像这样的东西TABS-TAB

4

2 回答 2

0

这是我发现有用并包含在我的init.el文件(或类似文件)中的内容,以强制 haskell-mode 每个选项卡使用四个空格。

(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)
于 2019-01-03T20:35:06.883 回答
0

您可以查看一些在 haskell 中开发的主要项目,例如parsec。在 parsec 的情况下,他们似乎使用了四个空格作为 guards

于 2016-05-12T02:39:34.727 回答