我该如何阅读这种类型的语法?

时间:2017-07-22 22:58:38

标签: types read-eval-print-loop idris

我正在阅读使用Idris进行类型驱动开发,我在第23页尝试使用valToString函数时遇到了一些令人困惑的格式。具体来说,我添加了一个功能孔:

valToString : (x : Bool) -> StringOrInt x -> String
valToString x val = (?f val)

当我向REPL询问这个洞的类型时,这就是打印结果:

*Hello> :t f
  x : Bool
  val : case x of
          True => Int
          False => String
--------------------------------------
f : case x of   True => Int False => String -> String
Holes: Main.f

val的类型在这里是否可读,但我应该如何阅读f 的类型?这本书提到on page 19在伊德里斯,空白是重要的;如果我将它用于我的程序中的类型,这将是有效的语法吗?

1 个答案:

答案 0 :(得分:1)

这似乎与空格无关。只是格式不好。

f : case x of   True => Int False => String -> String

可以像这样重新格式化:

f : (case x of {True => Int; False => String}) -> String

当我在Idris repl中输入:t f时,这显示给我的下一件事:

*Hello> :t f
  x : Bool
  val : StringOrInt x
--------------------------------------
f : StringOrInt x -> String
Holes: Main.f

此案例仅为StringOrInt x类型的内联版本。虽然格式不佳。在编写本章时,可能会使用旧版Idris

更新(23.07.2017)

不幸的是,不是每个人都有书:(我试着猜测StringOrInt的类型,但我没猜错。我在我的代码中使用了下一个定义:

StringOrInt : Bool -> Type
StringOrInt True  = Int
StringOrInt False = String

根据这个定义,我从上面得到输出。实际上StringOrInt以下一种方式定义:

StringOrInt : Bool -> Type
StringOrInt x = case x of
    True => Int
    False => String

这两个定义在语义上是等价的。差别只是句法。但显然这会导致:t f命令的编译器输出不同。

我已经打开了相应的问题:

https://github.com/idris-lang/Idris-dev/issues/3937