Size: a a a

2021 July 02

IK

Ilya Kos in Haskell
Мне кажется, тут разница в том что в пером у тебя из-за GADT вводится в скоуп новый тип, а во втором ты конструируешь значение типы `forall n . KnownNat n => Proxy n -> r` и это *значение* пытает тайпчекнутся. В первом случае у тебя эта переменная не пытается тайпчекнутся извне.
источник

IK

Ilya Kos in Haskell
Но это все равно не отвечает на вопрос
источник

IK

Ilya Kos in Haskell
Второй ты можешь вернуть из скуопа, а первый нет по-моему
источник

IO

I O in Haskell
Вернуть типа какой-нибудь Vec n a? Ни в одном не могу по идее, оба экзистенциальные
источник

DM

Dmitriy Mozhevitin in Haskell
сколотил что-то типа такого

class Cls (name :: Symbol) where
 f :: String

instance (IsEmpty name ~ flag, Cls' flag name) => Cls name where
 f = f' @flag @name (Proxy :: Proxy flag)

class Cls' (flag :: Bool) (name :: Symbol) where
 f' :: Proxy flag -> String

instance Cls' 'True name where
 f' _ = "empty symbol"

instance Cls' 'False anyName where
 f' _  = "any symbol"

type family (IsEmpty (a :: Symbol)) :: Bool where
 IsEmpty "" = 'True
 IsEmpty _  = 'False

main :: IO ()
main = do
 let s = ""
 let someSymb = someSymbolVal s
 case someSymb of
   (SomeSymbol (p :: Proxy w)) -> putStrLn $ f @w


при вызове f @w ругается на

• Could not deduce (Cls' (IsEmpty n) n) arising from a use of ‘f’
 from the context: KnownSymbol n


я правильно понимаю что это из-за того, что неизвестен результат IsEmpty w в компайл-тайме?
источник

IK

Ilya Kos in Haskell
да
источник

IK

Ilya Kos in Haskell
Про него только KnownSymbol известно
источник

IK

Ilya Kos in Haskell
Потому что оно в рантайме только появляется
источник

DM

Dmitriy Mozhevitin in Haskell
что вообще сугубо идейно значит приставка Known в KnownNat , KnownSymbol и тд?
источник

IK

Ilya Kos in Haskell
А понять IsEmpty можно только во время компиляции
источник

IK

Ilya Kos in Haskell
Потому что после компиляции IsEmpty пропадает
источник

DM

Dmitriy Mozhevitin in Haskell
я как раз таки и думал что оно значит "мы знаем, чему равно"
источник

IK

Ilya Kos in Haskell
Что можно создать значение, соответсвующие типу
источник

IK

Ilya Kos in Haskell
Что мы знаем это значение
источник

IK

Ilya Kos in Haskell
Что это как бы “известный” тип
источник

DM

Dmitriy Mozhevitin in Haskell
так на w же есть KnownSymbol
источник

IK

Ilya Kos in Haskell
да
источник

DM

Dmitriy Mozhevitin in Haskell
что по идее должно значить "мы знаем, что это за тип"
источник

DM

Dmitriy Mozhevitin in Haskell
но по идее не знаем
источник

IK

Ilya Kos in Haskell
Но это уже хаки компилятора
источник