У меня есть две функции, обе с типом Nat (из TypeNats), у обеих есть оператор типа сравнения <=
.Ограничение 2 <= n
для функции b
содержит ограничение 1 <= n
для функции a
.Есть ли способ заставить ghc решить, что 2 <= n
удовлетворяет ограничению 1 <= n
, поэтому мне не нужно указывать оба ограничения (1 <= n, 2 <= n)
для b
?
Приведенный ниже код демонстрирует ошибку.
{-# LANGUAGE KindSignatures, TypeOperators, ScopedTypeVariables,
DataKinds, TypeFamilies #-}
import GHC.TypeNats
import Data.Proxy
a :: forall (a :: Nat). 1 <= a => Proxy a -> Int
a = undefined
b :: forall (a :: Nat). 2 <= a => Proxy a -> Int
b = a
Приводит к ошибке компиляции
• Could not deduce: (1 <=? a) ~ 'True arising from a use of ‘a’
from the context: 2 <= a
bound by the type signature for:
b :: forall (a :: Nat). (2 <= a) => Proxy a -> Int
at Example.hs:9:1-48
• In the expression: a
In an equation for ‘b’: b = a
• Relevant bindings include
b :: Proxy a -> Int
(bound at Example.hs:10:1)
Есть библиотека для решения равенств ghc-typelits-natnormalise , но не неравенства.