KZ
Size: a a a
KZ
DB
• Type constructor ‘Matrix’ used where a value identifier was expected
• In the expression: ((Matrix (1, 2)) [[a, b]] :: Matrix 1 2 Int)
In an equation for ‘it’:
it = ((Matrix (1, 2)) [[a, b]] :: Matrix 1 2 Int)
DB
. let v = (AppE (AppE (ConE ''Matrix) (TupE [LitE $ IntegerL m, LitE $ IntegerL n])) (ListE $ map ListE matrix))
let t = (AppT (AppT (AppT (ConT ''Matrix) (LitT (NumTyLit m))) (LitT (NumTyLit n))) mType)
pure $ SigE v t
DB
DB
KZ
Matrix
?DB
data Matrix (m :: Nat) (n :: Nat) a where
Matrix :: (Int, Int) -> [[a]] -> Matrix m n a
E :: Num a => a -> Matrix n n a
Z :: Num a => Matrix m n a
DB
a = 5 :: Int
b = 6 :: Int
[matrix| a b |]
_:
m
a = 5 :: Int
b = 6 :: Int
[matrix| a b |]
DB
DB
matrix :: QuasiQuoter
matrix =
QuasiQuoter
{ quoteExp = expr
, quotePat = undefined
, quoteType = undefined
, quoteDec = undefined
}
expr :: String -> Q Exp
expr source = do
let matrix =
case traverse (traverse parseExp . words) $
filter (not . null) $ lines source of
Right ok -> ok
Left err -> error $ "MatrixTH parse error: " <> err
mType <- resolveType $ concat matrix
let m = fromIntegral $ length matrix
let n =
let lengths = map length matrix
in if allEq lengths
then fromIntegral $ maybe 0 id $ listToMaybe lengths
else error "MatrixTH all lines must be same length"
let v = (AppE (AppE (ConE ''Matrix) (TupE [LitE $ IntegerL m, LitE $ IntegerL n])) (ListE $ map ListE matrix))
let t = (AppT (AppT (AppT (ConT ''Matrix) (LitT (NumTyLit m))) (LitT (NumTyLit n))) mType)
pure $ SigE v t
DB
λ > m = [matrix| a b |]
<interactive>:17:13: error:
• Type constructor ‘Matrix’ used where a value identifier was expected
• In the expression: ((Matrix (1, 2)) [[a, b]] :: MatrixT 1 2 Int)
In an equation for ‘m’:
m = ((Matrix (1, 2)) [[a, b]] :: MatrixT 1 2 Int)
JS
. let v = (AppE (AppE (ConE ''Matrix) (TupE [LitE $ IntegerL m, LitE $ IntegerL n])) (ListE $ map ListE matrix))
let t = (AppT (AppT (AppT (ConT ''Matrix) (LitT (NumTyLit m))) (LitT (NumTyLit n))) mType)
pure $ SigE v t
''Matrix
— имя (конструктора) типа, 'Matrix
— имя (конструктора) данногоDB
''Matrix
— имя (конструктора) типа, 'Matrix
— имя (конструктора) данногоJS
data A = B
и data B = A