为什么 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

由于语言的演变,这是一种无意的不一致,这种不一致是可以修复的。

语言首次发布时,ifmerge 都不能 return 类型。后来,联合和 merge 更新为允许此拉取请求中的类型:

…但我们还没有用匹配的更改更新 if 表达式。