我正在阅读使用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在伊德里斯,空白是重要的;如果我将它用于我的程序中的类型,这将是有效的语法吗?
答案 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
命令的编译器输出不同。
我已经打开了相应的问题: