Dhall has functions that return types:
let f = \(b : Bool) -> Natural -- ok
And it has if
expressions:
let f = \(b: Bool) -> if b == True then 1 else 0 -- ok
But the two features can't be used together:
-- Error: ❰if❱ branch is not a term
let f= \(b : Bool) -> if b == True then Natural else Integer
in 3
Why?
At first I thought this was a trick to avoid having dependent types, but it seems Dhall does allow types to really depend on values when working with unions. The following compiles fine:
let MyBool = <T | F>
let myIf: MyBool -> Type = \(b: MyBool) ->
merge
{ T = Bool
, F = Natural
}
b
in 3
UPDATE
The dhall standard supports such if expressions now, as does dhall-haskell, thanks @gabriel-gonzales
It's an unintentional inconsistency in the language due to how it evolved, and the inconsistency can be fixed.
When the language was first released neither
if
normerge
could return a type. Later on, unions andmerge
were updated to permit types in this pull request:… but we haven't yet updated
if
expressions with a matching change.