何时(确切)可以使用'='在不同类型之间提出相等性?

时间:2017-07-21 10:29:35

标签: idris

在文档中,它说:

  

伊德里斯的平等是异质的,这意味着我们甚至可以提出建议   不同类型的价值之间的平等:

idris_not_php : 2 = "2"

该特定示例编译,但该洞呈现为fromInteger 2 = "2"类型。鉴于fromInteger 2可以属于Num实例的任何类型,编译器可能不够聪明,无法推断出2的值不是String }?

相比之下,以下略有不同的代码无法编译:

idris_not_php : S (S Z) = "2"

编译器报告NatString之间的类型不匹配。

此外,以下编译成功:

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

是否有任何特定规则可以在不同类型的内容之间使用=,或者只是在~=~不起作用时使用=的问题? ~=~=在语义上是否相同,如果是,为什么~=~甚至是必要的?

1 个答案:

答案 0 :(得分:1)

This answer对伊德里斯的异质平等有一些理论上的注释。 this answer举例说明了您可能需要(~=~)的原因。

我只想添加一些关于idris_not_php : 2 = "2"示例的内容。如果您有Num类型的String实例,则可以对此 进行类型检查。 Idris中的积分常数是多态的。但是,任何合理的程序都不会为String提供此类实例,因为它没有意义。