【发布时间】:2019-07-20 16:14:41
【问题描述】:
从 Haskell 类型系统的表面开始,运行以下代码:
Prelude> e = []
Prelude> ec = tail "a"
Prelude> en = tail [1]
Prelude> :t e
e :: [a]
Prelude> :t ec
ec :: [Char]
Prelude> :t en
en :: Num a => [a]
Prelude> en == e
True
Prelude> ec == e
True
不知何故,尽管 en 和 ec 有不同的类型,但它们都在 == e 上测试 True。我说“不知何故”不是因为我感到惊讶(我不是),而是因为我不知道允许这样做的规则/机制的名称是什么。就好像表达式“[] == en”中的类型变量“a”被允许采用“Num”的值进行评估。同样当用“[] == ec”测试时,它可以变成“Char”。
我不确定我的解释是否正确的原因是:
Prelude> (en == e) && (ec == e)
True
,因为直觉上这意味着在同一个表达式中,e “同时”假定 Num 和 Char 的值(至少我习惯于这样解释 && 的语义)。除非 Char 的“假设”仅在 (ec == e) 的评估期间起作用,并且 (en == e) 被独立评估,在单独的......减少? (我在这里猜测一个术语)。
然后是这样的:
Prelude> en == es
<interactive>:80:1: error:
• No instance for (Num Char) arising from a use of ‘en’
• In the first argument of ‘(==)’, namely ‘en’
In the expression: en == es
In an equation for ‘it’: it = en == es
Prelude> es == en
<interactive>:81:7: error:
• No instance for (Num Char) arising from a use of ‘en’
• In the second argument of ‘(==)’, namely ‘en’
In the expression: es == en
In an equation for ‘it’: it = es == en
对异常并不感到惊讶,但惊讶于在两个测试中,错误消息都抱怨“使用 'en'”——不管它是第一个操作数还是第二个操作数。
也许需要学习有关 Haskell 类型系统的重要一课。感谢您的宝贵时间!
【问题讨论】:
标签: haskell types type-systems