DI
Size: a a a
DI
DM
class Cls (name :: Symbol) where
f :: String
instance {-# OVERLAPPING #-} Cls "" where
f = "empty symbol"
instance {-# OVERLAPPABLE #-} (KnownSymbol anyName) => Cls anyName where
f = "any symbol"
main :: IO ()
main = do
let s = ""
let someSymb = someSymbolVal s
case someSymb of
(SomeSymbol (p :: Proxy w)) -> putStrLn $ f @w
any symbol
, аstr :: String
str = f @""
empty symbol
empty symbol
MK
f @w
решение какой инстанс использовать принимается на этапе компиляции, когда ещё неизвестно какой там конкретно символMK
KnownSymbol anyName => Cls anyName
подходит тамDB
DM
instance {-# OVERLAPPING #-} (KnownSymbol name, name ~ "") => Cls name where
f = "empty symbol"
instance {-# OVERLAPPABLE #-} (KnownSymbol anyName) => Cls anyName where
f = "any symbol"
duplicate instance declarations
, хотя чисто интуитивно инстанс для пустого символа и констрейнт на равенство пустой строке должны быть эквивалентныempty symbol
, есть ли какие-то воркэраунды?MK
MK
MK
MK
IO
class Foo (x :: Nat) where
x :: String
instance {-# OVERLAPS #-} Foo 0 where
x = "zero"
instance {-# OVERLAPPING #-} KnownNat n => Foo n where
x = show $ natVal $ Proxy @n
foo :: forall n . KnownNat n => String
foo = x @n
DM
DB
MK
(KnownSymbol anyName, (anyName == "") ~ 'False)
попробуйMK