为什么 Dhall 不允许从 if 表达式返回类型?
Why doesn't Dhall allow returning types from if expressions?
Dhall 具有 return 类型的函数:
let f = \(b : Bool) -> Natural -- ok
它有if
个表达式:
let f = \(b: Bool) -> if b == True then 1 else 0 -- ok
但是这两个功能不能一起使用:
-- Error: ❰if❱ branch is not a term
let f= \(b : Bool) -> if b == True then Natural else Integer
in 3
为什么?
起初我认为这是避免依赖类型的技巧,但 Dhall 似乎确实允许类型在使用联合时真正依赖于值。以下编译正常:
let MyBool = <T | F>
let myIf: MyBool -> Type = \(b: MyBool) ->
merge
{ T = Bool
, F = Natural
}
b
in 3
更新
dhall standard supports such if expressions now, as does dhall-haskell,感谢@gabriel-gonzales
由于语言的演变,这是一种无意的不一致,这种不一致是可以修复的。
语言首次发布时,if
和 merge
都不能 return 类型。后来,联合和 merge
更新为允许此拉取请求中的类型:
…但我们还没有用匹配的更改更新 if
表达式。
Dhall 具有 return 类型的函数:
let f = \(b : Bool) -> Natural -- ok
它有if
个表达式:
let f = \(b: Bool) -> if b == True then 1 else 0 -- ok
但是这两个功能不能一起使用:
-- Error: ❰if❱ branch is not a term
let f= \(b : Bool) -> if b == True then Natural else Integer
in 3
为什么?
起初我认为这是避免依赖类型的技巧,但 Dhall 似乎确实允许类型在使用联合时真正依赖于值。以下编译正常:
let MyBool = <T | F>
let myIf: MyBool -> Type = \(b: MyBool) ->
merge
{ T = Bool
, F = Natural
}
b
in 3
更新
dhall standard supports such if expressions now, as does dhall-haskell,感谢@gabriel-gonzales
由于语言的演变,这是一种无意的不一致,这种不一致是可以修复的。
语言首次发布时,if
和 merge
都不能 return 类型。后来,联合和 merge
更新为允许此拉取请求中的类型:
…但我们还没有用匹配的更改更新 if
表达式。