我希望这个问题适合这个网站,它只是选择Idris中与Haskell相比的具体语法,因为两者非常相似。我猜它并不重要,但我对它很好奇。对于Haskell使用=>
的某些情况,Idris使用->
。到目前为止,我已经看到Idris仅在函数类型中使用->
而在{1}}中使用lambdas和=>
等其他内容。这种选择是否来自于认识到在这些用例之间有明确的语法区别在实践中是否有用?这只是一种任意的化妆品选择而我是否过度思考它?
答案 0 :(得分:5)
好吧,在Haskell中,类型签名和值在不同的命名空间中,因此在一个中定义的东西不会与另一个中的某些东西发生冲突。在Idris中,类型和值占据相同的命名空间,这就是您不能看到的原因。像在Haskell中那样data Foo = Foo
,而是data Foo = MkFoo
- 类型被称为Foo
,构造函数被称为MkFoo
,因为已经存在一个值(类型) Foo
),绑定到名称Foo
,例如data Pair = MkPair
http://docs.idris-lang.org/en/latest/tutorial/typesfuns.html#tuples
所以它可能是最好的,它没有尝试使用用于构造函数类型的箭头,使用用于lambdas的箭头 - 这些是相当不同的东西。您可以将它们与例如the (Int -> Int) (\x => x)
。
答案 1 :(得分:0)
我认为这是因为他们对->
符号的解释不同。
来自Wikipedia:
没有任何内容
A => B
表示如果A
为真,则B
也为真;如果A
为false,则说明B
似乎适用于案例表达式,
->
可能与=>
相同,或者它可能具有下面给出的函数的含义
是
f: X -> Y
表示函数f
将集合X
映射到集合Y
所以我的猜测是Idris只使用->
来表示狭义的第二个含义,即在类型签名中将一种类型映射到另一种类型,而Haskell使用更广泛的解释,其中它与{{1}相同}。