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

Types 我应该如何阅读这种类型的语法?,types,read-eval-print-loop,idris,Types,Read Eval Print Loop,Idris,我正在阅读Idris的类型驱动开发,在第23页的函数实验中遇到了一些令人困惑的格式。具体来说,我添加了一个函数孔: valToString : (x : Bool) -> StringOrInt x -> String valToString x val = (?f val) 当我向REPL询问此孔的类型时,这是打印结果: *你好>:t f x:布尔 val:案例x 真=>Int False=>String -------------------------------------

我正在阅读Idris的类型驱动开发,在第23页的函数实验中遇到了一些令人困惑的格式。具体来说,我添加了一个函数孔:

valToString : (x : Bool) -> StringOrInt x -> String
valToString x val = (?f val)
当我向REPL询问此孔的类型时,这是打印结果:

*你好>:t f
x:布尔
val:案例x
真=>Int
False=>String
--------------------------------------
f:True=>Int False=>String->String的情况x
孔:Main.f

这里的
val
类型足够可读,但是我应该如何读取
f
的类型?书中提到空白在Idris中很重要;如果我将它用于程序中的某个类型,这是有效的语法吗?

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

这个

可以按如下方式重新格式化:

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

更新(2017年7月23日)

不幸的是,并不是每个人都有这本书:(我试着猜测
StringOrInt
的类型,但我并没有准确地猜出来。我在代码中使用了下一个定义:

StringOrInt : Bool -> Type
StringOrInt True  = Int
StringOrInt False = String
通过这个定义,我从上面得到了输出。而实际上,
StringOrInt
是用下一种方式定义的:

StringOrInt : Bool -> Type
StringOrInt x = case x of
    True => Int
    False => String
这两个定义在语义上是等价的。只是语法上有所不同。但显然这会导致
:tf
命令的编译器输出不同

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


谢谢,您的格式更合理!您使用的是哪一版本的Idris提供了REPL输出?我的问题中的输出来自Idris 1.0。我不相信这本书使用的是旧版本,特别是说1.0版与这本书相对应。虽然我可能不太明白,但您能澄清一下是什么版本吗你的意思是什么?事实上,也许你对书中使用的Idris版本的看法是对的:第28页的
integerval+doubleval
示例引用了
Prelude.Classes.+
,而Idris 1.0 REPL引用了
Prelude.Interfaces.+
。@samestp我也在使用Idris 1.0。但是编译器的1.0版本是它在8月1日发布,而这本书在3月发布。这意味着许多代码编写得更早。而且这些代码片段可能是使用编译器生成的,而没有使用1.0版本中的一些修补程序。@SamEstep我已更新了我的答案。在这种情况下,问题不在编译器版本中。感谢您的澄清!我抱歉没有明确说明
StringOrInt
的定义;由于本书的第一章是在线免费提供的,因此可以在我在问题中给出的链接中找到
StringOrInt
功能。
StringOrInt : Bool -> Type
StringOrInt x = case x of
    True => Int
    False => String