Haskell “哈斯克尔”;h1>&引用;语法与科学单元检查
我一直在尝试使用Haskell的类型检查器作为任何算术/数学的单位检查器进行复制,以获得一致的单位(即米、千克、秒及其导数) 本质上,介绍了一种计算Peano数字的方法以及递归定义列表的方法。然后使用这两个特征将单位类型定义为列表,每个元素都是一个与米、千克和秒的指数相对应的Peano数字 我被他们提供的以下代码所困扰:Haskell “哈斯克尔”;h1>&引用;语法与科学单元检查,haskell,Haskell,我一直在尝试使用Haskell的类型检查器作为任何算术/数学的单位检查器进行复制,以获得一致的单位(即米、千克、秒及其导数) 本质上,介绍了一种计算Peano数字的方法以及递归定义列表的方法。然后使用这两个特征将单位类型定义为列表,每个元素都是一个与米、千克和秒的指数相对应的Peano数字 我被他们提供的以下代码所困扰: -- multiply units composed of non-empty lists recursively instance (Add i j k, Mult r s
-- multiply units composed of non-empty lists recursively
instance (Add i j k, Mult r s t) =>
Mult ((a, i) `Cons` r) ((a, j) `Cons` s) ((a, k) `Cons` t) where
mult ((a, i) `Cons` r) ((_, j) `Cons` s) h1>
(a, add i j) `Cons` mult r s
在本教程中,我看不到定义了h1>
。编译器报告:
parse error (possibly incorrect indentation or mismatched brackets)
|
314 | main :: IO ()
| ^
其中314是在引入乘法实例
定义块之前工作的下一行代码。我尝试了上述代码的以下排列:
-- multiply units composed of non-empty lists recursively
instance (Add i j k, Mult r s t) =>
Mult ((a, i) `Cons` r) ((a, j) `Cons` s) ((a, k) `Cons` t) where
mult ((a, i) `Cons` r) ((_, j) `Cons` s) ((a, add i j) `Cons` mult r s)
达到同样的结果。由于没有人在教程评论中抱怨,目前我猜两个选项声明是罪魁祸首:
{-# OPTIONS -fglasgow-exts #-}
{-# OPTIONS -fallow-undecidable-instances #-}
因为两者都会发出弃用警告。但在我看来,如果有什么东西被否决了,它应该仍然有效,所以我有点困惑。我正在使用GHC 8.4.3
对于上面的
实例
声明,正确的格式是什么?我很确定这只是一个打字错误,或者是某种HTML,不知何故粘贴在Haskell脚本中
该代码可能应理解为:
-- multiply units composed of non-empty lists recursively
instance (Add i j k, Mult r s t) =>
Mult ((a, i) `Cons` r) ((a, j) `Cons` s) ((a, k) `Cons` t) where
mult ((a, i) `Cons` r) ((_, j) `Cons` s) = (a, add i j) `Cons` mult r s
在链接的教程中,会出现另一个h1>
,它也应该是=
。即使教程很旧,也应该在编译时添加一些扩展。GHC应在错误消息中指出您需要哪些扩展。我会继续重新编译它,并根据需要启用扩展
Haskell中没有特殊的
h1>
语法。(社区:我很想投票以“离题-小错误”来结束这篇文章),但最终还是回答了。我不确定这里的正确操作应该是什么,因为这不是OP的错别字,OP看起来真的被一个看似奇怪的语法弄糊涂了。请随意不同意:-)