在文档中,它说:
伊德里斯的平等是异质的,这意味着我们甚至可以提出建议 不同类型的价值之间的平等:
idris_not_php : 2 = "2"
该特定示例编译,但该洞呈现为fromInteger 2 = "2"
类型。鉴于fromInteger 2
可以属于Num
实例的任何类型,编译器可能不够聪明,无法推断出2
的值不是String
}?
相比之下,以下略有不同的代码无法编译:
idris_not_php : S (S Z) = "2"
编译器报告Nat
和String
之间的类型不匹配。
此外,以下编译成功:
Num String where
(+) x y = y
(*) x y = y
fromInteger n = "2"
idris_not_php : 2 = "2"
idris_not_php = the (the String 2 = "2") Refl
这两个编译:
idris_not_php : S (S Z) ~=~ "2"
idris_not_php = ?hole
two_is_two : 2 ~=~ 2
two_is_two = Refl
是否有任何特定规则可以在不同类型的内容之间使用=
,或者只是在~=~
不起作用时使用=
的问题? ~=~
和=
在语义上是否相同,如果是,为什么~=~
甚至是必要的?
答案 0 :(得分:1)
This answer对伊德里斯的异质平等有一些理论上的注释。 this answer举例说明了您可能需要(~=~)
的原因。
我只想添加一些关于idris_not_php : 2 = "2"
示例的内容。如果您有Num
类型的String
实例,则可以对此 进行类型检查。 Idris
中的积分常数是多态的。但是,任何合理的程序都不会为String
提供此类实例,因为它没有意义。