Size: a a a

2020 July 25

KZ

Kirill Zaborsky in Haskell
практика делает чудеса
источник

DB

Danil Berestov in Haskell
Упражняюсь тут с TH
Выпала ошибка
• 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

Danil Berestov in Haskell
. 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

Danil Berestov in Haskell
Чего ему не нравится?
источник

DB

Danil Berestov in Haskell
Кастую @cblp_su
источник

KZ

Kirill Zaborsky in Haskell
а какое определение у Matrix?
источник

DB

Danil Berestov in Haskell
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

Danil Berestov in Haskell
Забыл вызов сам, кстати
a = 5 :: Int 
b = 6 :: Int
[matrix| a b |]
источник

_:

_Ryner' :: IO ❄️ in Haskell
Jerzy Syrowiecki
в принципе нет. мне удобнее в кабале. в общем, субъективно
Ручками каждый новый модуль добавлять не прям так уж удобно
источник

m

mark in Haskell
Danil Berestov
Забыл вызов сам, кстати
a = 5 :: Int 
b = 6 :: Int
[matrix| a b |]
А как квази-квотер matrix определен?
источник

DB

Danil Berestov in Haskell
mark
А как квази-квотер matrix определен?
Блин, я там наговнял(
источник

m

mark in Haskell
Такое чувство что он не в том скоупе запускается
источник

DB

Danil Berestov in Haskell
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
источник

m

mark in Haskell
Ну вот и ошибка. Если ты исеользуешь квотер экспрешном то и ставить его нужно только там где экспрешны
источник

m

mark in Haskell
Попробуй
matrix = [matrix| ...  |]
источник

m

mark in Haskell
Если хочется топ-левел дефинишн - то нужно определять quoteDec
источник

DB

Danil Berestov in Haskell
λ > 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

Jerzy Syrowiecki in Haskell
Danil Berestov
. 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

Danil Berestov in Haskell
Jerzy Syrowiecki
''Matrix — имя (конструктора) типа, 'Matrix — имя (конструктора) данного
Класс! Спасибо)
источник

JS

Jerzy Syrowiecki in Haskell
это нужно, чтобы отличать data A = B и data B = A
источник