| 'KFalse
type family Default (flag :: KBool) (a :: k) (b :: k) :: k
type instance Default 'KTrue a _ = a
type instance Default 'KFalse _ b = b
cmp :: forall (flag :: KBool) a c
. (Default flag Truth (Eq a), c ~ Default flag Int a)
=> c -> c -> c
cmp x y = x == yКак сформулировать тип cmp, чтобы убедить компилятор, что в любом случае Eq c?
Было бы удобно, если бы можно было как-то дикт получить и использовать как док-во, но в constraint я не нашел как из Dict и a получить констрейнт, а у самого мозгов не хватает.
а никак. типы стираются, и передача значения Int не означает передачу словарика Eq Int
Типы-то в рантайме стираются, а тут компайл-тайм вычисления.
словарики тоже передаются в рантайме. надо во время компиляции так сделать, чтобы словарик был в рантайме. как?
а зачем нужен KBool
если минимизировать пример, будет cmp :: forall (flag :: Bool) a. If flag (a ~ Int) (Eq a) => a -> a -> Bool cmp x y = x == y Could not deduce (Eq a) arising from a use of ‘==’ from the context: If flag (a ~ Int) (Eq a)
Обсуждают сегодня