Почему Dhall не разрешает возвращать типы из выражений if?

#dhall

#dhall

Вопрос:

У Dhall есть функции, которые возвращают типы:

 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 теперь поддерживает такие выражения if, как и dhall-haskell, спасибо @gabriel-gonzales

Ответ №1:

Это непреднамеренное несоответствие в языке из-за того, как он развивался, и несоответствие может быть исправлено.

Когда язык был впервые выпущен if , ни merge один из них не мог возвращать тип. Позже объединения и merge были обновлены, чтобы разрешить типы в этом запросе на извлечение:

… но мы еще не обновили if выражения соответствующим изменением.

Комментарии:

1. Спасибо, что перезвонили мне, я открыл проблему для обновления стандарта: github.com/dhall-lang/dhall-lang/pull/1090

2. Добро пожаловать, и спасибо за исправление стандарта 🙂