伊德里斯的胖箭

fat arrow in Idris

我希望这个问题适合这个站点,它只是关于与 Haskell 相比 Idris 中具体语法的选择,因为两者非常相似。我想这不是那么重要,但我对此很好奇。对于 Haskell 使用 -> 的某些情况,Idris 使用 =>。到目前为止,我已经看到 Idris 仅在函数类型中使用 ->,而在其他方面使用 =>,例如 lambda 和 case _ of。这个选择是否来自于意识到在实践中对这些用例进行明确的句法区分是有用的?这只是一个任意的化妆品选择,我想多了吗?

我认为这是因为他们对 -> 符号的解释不同。 来自 Wikipedia

A => B means if A is true then B is also true; if A is false then nothing is said about B

这似乎适合 case 表达式,并且

-> may mean the same as =>, or it may have the meaning for functions given below

也就是

f: X -> Y means the function f maps the set X into the set Y

所以我的猜测是 Idris 只是使用 -> 来表示狭义的第二个含义,即在类型签名中将一种类型映射到另一种类型,而 Haskell 使用更广泛的解释,它意味着与 =>.

相同

好吧,在 Haskell 中,类型签名和值位于不同的命名空间中,因此在一个中定义的内容不会与另一个中的内容发生冲突。在 Idris 中,类型和值占用相同的命名空间,这就是为什么您看不到例如data Foo = Foo 就像在 Haskell 中一样,而是 data Foo = MkFoo - 类型称为 Foo,构造函数称为 MkFoo,因为已经有一个值(类型 Foo),绑定到名称 Foo,例如data Pair = MkPair http://docs.idris-lang.org/en/latest/tutorial/typesfuns.html#tuples 所以它可能是最好的,它没有尝试使用用于构造函数类型的箭头,使用用于 lambda 的箭头——它们是完全不同的东西。您可以将它们与例如the (Int -> Int) (\x => x).