为什么我不应该混合使用制表符和空格?

2024-01-04

我经常读到,我不应该在 Haskell 中混合使用制表符和空格,或者我根本不应该使用制表符。为什么?


问题是双重的。首先,Haskell 对缩进敏感,例如以下代码无效:

example = (a, b)
  where
    a = "Hello"
     b = "World"

两个绑定都需要缩进相同数量的空格/制表符(请参阅越位规则 https://en.wikipedia.org/wiki/Off-side_rule)。虽然在本例中很明显,但在下一个例子中它相当隐藏,我用以下方式表示空格·和一个选项卡»:

example = (a, b)
··where
····a = "Hello"
»   b = "World"

如果编辑器显示按 4 的倍数对齐的制表符,这将看起来像有效的 Haskell 代码。但事实并非如此。 Haskell 制表符按八的倍数对齐,因此代码将被解释如下:

example = (a, b)
··where
····a = "Hello"
»       b = "World"

其次,如果仅使用选项卡,最终可能会得到看起来不正确的布局。例如,如果选项卡显示有六个或更多空格(本例中为八个),则以下代码看起来是正确的:

example = (a, b)
»       where»  a = "Hello"
»       »       b = "World"

但在另一个使用 4 个空格的编辑器中,它看起来不再正确:

example = (a, b)
»   where»  a = "Hello"
»   »   b = "World"

但它仍然是正确的。然而,习惯了空格的人可能会重新缩进b' 与空格绑定并最终导致解析器错误。

如果您在整个代码中强制执行代码约定,以确保仅在行首使用制表符并在行后使用换行符where, let or do您可以避免一些问题(请参阅11 http://dmwit.com/tabs/)。然而,当前版本的GHC 默认警告选项卡 https://downloads.haskell.org/ghc/latest/docs/html/users_guide/using-warnings.html, 因为他们have https://stackoverflow.com/questions/35853689/parse-error-on-input-function-haskell been https://stackoverflow.com/questions/35060673/parse-error-in-nested-if-do-blocks a https://stackoverflow.com/questions/33480140/parse-error-in-pattern-putstrln-possibly-caused-by-a-missing-do source https://stackoverflow.com/questions/24842552/haskell-parse-error-on-input of https://stackoverflow.com/questions/24372766/parse-error-in-valid-code many https://stackoverflow.com/questions/16870038/haskell-syntax-error-for-where-statement过去的解析器错误,因此您可能也想摆脱它们。

See also

  • 关于该主题的 Reddit 主题 https://www.reddit.com/r/haskell/comments/15gz8q/a_nondirty_shot_at_tabs_vs_spaces/(大多数专业空间,但也有一些专业选项卡)
  • 良好的哈斯克尔风格 http://urchin.earth.li/%7Eian/style/haskell.html(专业空间)
  • 又一场标签与空间的争论 http://dmwit.com/tabs/(专业混音)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不应该混合使用制表符和空格? 的相关文章

  • 澄清Update() 和FixedUpdate() 的使用? Unity2D [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 所以我知道FixedUpdate应该用于物理操作等 但我很难理解什么算作物理 例如 我通过查看按下的键来移动角色 然后施加力 目前我正
  • Haskell 中的所有图形和 Web 库是如何实现的?

    我才开始学习Haskell 我读到它是一种纯函数式语言 其中的所有内容都是不可变的 因此 输入输出 写入和读取数据库之类的事情会导致状态的可变性 我知道 Haskell 中有一种叫做 monad 的东西 它允许在 Haskell 中使用命令
  • Haskell:从后面访问列表

    今天我开始学习Haskell 我对函数式语言有点陌生 而且我非常喜欢 Haskell 然而 我有一个关于它的设计的问题困扰着我 从我到目前为止的理解来看 访问列表后面的元素似乎比访问前面的元素要复杂得多 类似于xs x where xs a
  • 使用对象初始化语法的操作顺序

    我使用对象初始值设定项语法设置属性的顺序是否以完全相同的顺序执行 例如 如果我这样做 var s new Person FirstName Micah LastName Martin IsLoaded true 每个属性都会以相同的顺序设置
  • `arr fst` 是如何自然变换的?

    I asked 这个问题 https stackoverflow com q 62733726 11143763不久以前 这是关于以下箭头定律 arr fst first f f arr fst Category k gt k b c gt
  • 加快 GHC 中的编译速度

    除了 O0 这可以加快编译时间吗 如果生成的程序未被优化也没关系 实际上我只想经常快速地对大型 haskell 包进行类型检查 Flag fno code极大地加快了编译速度 但无法使用它 因为该程序使用了 TemplateHaskell
  • 如何从有向无环图导出FRP?

    我目前正在研究我的下一个项目 目前处于预规划阶段 因此这个问题只是为了了解现有技术的概述 Setup 我有一个具有多个输入和输出的有向无环图 DAG 现在考虑人工神经网络 处理这种结构的常见方法是在每个 时间 步骤上处理整个网络 我相信这是
  • 为什么 Kleisli 不是 Monoid 的一个实例?

    如果您希望附加两个类型 a gt m b 的函数 以便只得到一个附加两个结果的相同类型的函数 您可以使用 Kleisli 来执行此操作 instance Monad m Monoid b gt Monoid Kleisli m a b wh
  • 为什么在 haskell 中不带括号不可能进行负数相乘

    乘法5 3在 haskell gchi 中给了我一个错误 但乘以5 3 工作正常 为什么需要括号 ghci GHCi version 7 4 1 http www haskell org ghc for help Loading packa
  • Haskell 中的随机枢轴快速排序

    是否有可能在 Haskell 中实现快速排序 使用 RANDOM PIVOT 但仍然有一个简单的Ord a gt a gt a 签名 我开始了解 Monad 目前 我将 monad 解释为某种 命令模式 这对于 IO 非常有用 所以 我知道
  • Haskell - 让函数返回空字符

    我正在尝试创建一个函数来删除字符串中的每个第 n 个元素 dropEvery String gt Int gt String dropEvery str n map char indx gt if indx mod n 0 then cha
  • Haskell 中的 Monad 和 Purity

    我的问题是 Haskell 中的 monad 是否真正保持了 Haskell 的纯度 如果是的话 又是如何保持的 我经常读到副作用是如何不纯粹的 但有用的程序 例如 I O 需要副作用 下一句指出 Haskell 对此的解决方案是 mona
  • 对类方法进行指针部分特化时出现“非法使用显式模板参数”

    您好 我在部分专业化方面遇到问题 我想要做的是拥有一个具有模板成员函数的类 该函数会将给定值解释为用户指定的值 例如类名是Value这是我想做的事情的一个片段 int ptr1 new int ptr1 10 Value val1 ptr1
  • 带边界的 haskell 列表数据类型

    我有以下类型定义来表示卡片 data Suit Hearts Spades Diamonds Clubs data Rank Numeric Integer Jack Queen King Ace data Card Card Rank S
  • Haskell 程序查找列表中元素的位置

    我需要编写一个函数来查找列表中一个特定元素的位置 我是这样写的 findPos list elt list 1 head list elt 0 otherwise 1 findPos tail list elt 但是如果列表中元素重复怎么办
  • Haskell 乘加运算的数学性能

    我正在用 Haskell 编写一个游戏 我当前在 UI 上的传递涉及大量几何图形的程序生成 我目前专注于识别一项特定操作的性能 C ish 伪代码 Vec4f multiplier addend Vec4f vecList for int
  • 当您包含导入 Gloss 的项目时,“stack ghci”会失败

    如果您在 Stack 项目中导入 Gloss 并使用stack ghci 您会收到以下错误 GHCi version 7 10 2 http www haskell org ghc for help
  • 如何在 Haskell 中处理这个简单的 IO 异常

    全部处理 在下面的代码中 getDirectoryContents dir可能会失败 例如dir可能不存在 如何捕获这个并向用户抛出有意义的消息 我知道 IO 异常处理已经被问过很多次了 但我仍然找不到一个简单的方法来做到这一点 walk
  • 为什么 Haskell 没有 I Monad(仅用于输入,与 IO monad 不同)?

    从概念上讲 执行输出的计算似乎与仅执行输入的计算有很大不同 从某种意义上说 后者更为纯粹 就我而言 我希望有一种方法将程序中仅输入的部分与可能实际写出内容的部分分开 那么 为什么没有输入只有 Monad 呢 为什么拥有一个 I monad
  • ghci 中严格求和/严格折叠导致内存爆炸

    正如中提到的为什么 sum takeWhile 以下是not炸毁记忆ghci https stackoverflow com questions 14298930 why does sum takewhile 10000000 1 use

随机推荐

  • Android 中如何更改按下时颜色按钮的颜色?

    我有一些按钮 我将其背景颜色分别设置为红色 绿色和蓝色 当我按下按钮时 会生成单击事件 但 gui 中没有任何变化让用户知道按钮被按下 Android 按钮的默认背景灰色变为橙色 释放按下状态后又恢复为灰色 如何在彩色按钮上实现此功能 这是
  • 使用 Rails 进行应用程序测试

    这更多的是一个一般性问题和某种最佳实践讨论 如何测试 Rails 应用程序 有 BDD 和 TDD 之类的口头禅以及 RSpec 和 Cucumber 之类的框架 但多少才足够 最好的方法是什么 使用 Cucumber 作为集成测试就足够了
  • 我可以将 Microsoft.Maui.Storage.Preferences 抽象为 MAUI 中的 IPreferences

    我正在编写一个 NET MAUI 应用程序 我想使用在我的 ViewModel 中 但是不希望将我的 ViewModel 绑定到静态Preferences类 否则很难测试 所以我注意到有一个IPreferences接口 但我不知道它的目的是
  • 使用 dotCover 时测试结果不一致

    我有一些带有单元测试的代码 这些代码在调试版本中通过 但在发布版本中失败 这是正确的 但是 当使用 JetBrains dotCover 运行时 相同的测试可以在调试和发布模式下通过 为了提供一些背景知识 这里是有问题的测试代码 只是为了让
  • iPhone应用程序允许背景音乐继续播放

    当我启动 iPhone 游戏时 一旦有声音播放 背景音乐或正在播放的播客就会停止 我注意到其他游戏允许背景音频继续播放 这怎么可能 我需要重写应用程序委托中的方法吗 将此行放入您的application didFinishLaunching
  • 为什么我不能从模板函数调用模板类的模板方法[重复]

    这个问题在这里已经有答案了 可能的重复 令人困惑的模板错误 https stackoverflow com questions 3786360 confusing template error 我有一个带有模板方法的模板类 现在我有另一个函
  • RabbitMQ 连接被拒绝 127.0.0.1:5672

    我正在准备一个简单的 ASP NET Core MVC Web 应用程序 我已经在我的笔记本电脑上安装了 RabbitMQ 服务器 RabbitMQ 管理 UI 正在运行localhost 15672 Rabbitmq 集群名称如下 ema
  • Rails 3 渲染视图没有动作

    我定义了特定操作的路线并创建了一个链接 我也创建了相应的视图 但没有代码定义控制器操作方法 单击链接后仍然会呈现视图 也就是说 视图是在实际不存在动作的情况下呈现的 有什么解释吗 是的 即使不存在相应的操作 视图也会被渲染 它会像为其定义的
  • .gitignore 不会忽略“git status”上带有空格的文件名

    当我做一个git status I get modified COM config Config Edit Project Settings lnk 但在我的 gitignore 中我有 lnk 这里发生了什么 会不会是空格的问题 问题不在
  • Cordova 的 FileTransfer 写入错误(代码 1)

    我正在使用 Android 版 Cordova 4 2 0 我有一些麻烦要解决文件传输插件 https github com apache cordova plugin file transfer好好工作 我认为有一个书写错误 except
  • 遗传算法中的轮盘赌选择。需要先对人口进行排序吗?

    在遗传算法中 当使用轮盘赌选择方法选择交叉成员时 是否需要首先按适应度等级对群体进行排序 可能性似乎是 首先按适应度升序对人口进行排序 按适应度降序对人口进行排序 不要对人口进行排序 让轮盘赌球落到它可能落下的地方 我认为无论哪种方式排序都
  • Xamarin.Android Intellisense 无法在 Visual Studio 2010 中工作

    我正在 Visual Studio 2010 中测试 Xamarin Android 并注意到在处理 Android 布局 axml 文件时没有 Android Intellisense 但是 当我处理 cs 文件时 我确实获得了 Andr
  • 在 Ionic 3 中定义模型的正确方法

    在 Ionic 3 中使用 getter 和 setter 定义模型的正确方法是什么 我跟着这个 export class ItemModel private name string constructor private n string
  • 封装 Ruby 函数

    我希望能够完全透明地包装任何 Ruby 过程 包括我自己没有编写源代码的过程 并记录其执行时间 my proc 也就是说 我想创建一个调用的过程my proc保存 上下文 接收者 论点 块 并打印出调用时的执行时间 例如 my proc p
  • 为什么 C# 中基类规范的含义不能递归地依赖于自身?

    以下 C 代码无法编译 public class A public interface B public class C A C B Error given here The type name B does not exist in th
  • WebResource.axd 和 ScriptResource.axd 加载时间超过 1 分钟

    我有个问题 有时 WebResource 和 ScriptResource 需要很长时间才能加载 超过 1 分钟 我们在一个集群中有多个节点 请注意 如果您在出现此问题之前打开了浏览器会话 则 axd 文件加载速度相当快 但新会话加载这些文
  • Spring数据休息@ManyToOne字段不以json形式出现

    我正在使用 Spring Boot Spring Data JPA 和 Spring Data Rest 技术开发一个 Web 项目 我能够成功设置所有内容并能够获取简单 POJO 的 JSON 我自定义了两个类以具有 OneToMany
  • 内联函数中 __LINE__ 的行为

    我有一个将行号和文件名传递给错误处理程序的宏 define SYSTEM FAILURE error code comment System Failure error code comment LINE FILE 如何将 LINE 在内联
  • Spring Rest API 和身份验证的自定义错误对象

    我有一个 Spring Boot Rest API 项目 我正在考虑如何更改从 Spring Boot 返回的默认错误对象 UseCase token api无需认证即可调用 其他api则通过传递token来调用 swagger UI 需要
  • 为什么我不应该混合使用制表符和空格?

    我经常读到 我不应该在 Haskell 中混合使用制表符和空格 或者我根本不应该使用制表符 为什么 问题是双重的 首先 Haskell 对缩进敏感 例如以下代码无效 example a b where a Hello b World 两个绑