https://combot.org/chat/-1001043143583 Ссылки на полезные ресурсы: https://ruhaskell.org/links.html ; Информация о мероприятиях: https://gist.github.com/qnikst/a96cac661be80d126d0829f2ced1916e
Я хочу добавить спаны в своё аст, но чтобы не пришлось переделывать половину кода и писать гору бойлерплейта
Читать полностью…Пойдёт, только надо свежую версию брать
https://learnyouahaskell.github.io/
я пока не понял для чего, но такую штуку можно переделать под свои нужды будет
а хранить можно как просто пару из индекса тега и f Any от значения
data Variant f scheme = V Int (f Any)
ну и нагородить сюда сейвовой апихи
ну еще можно несложно нагородить просто открытую структуру аля окамловые варианты, и там вообще че угодно можно будет сделать, ток матчить придется вью-паттернами
Читать полностью…и че с этим делать потом, лямбда это не value но expr, а замыкание это не expr но value
Читать полностью…можно
type Expr = Located Expr'Читать полностью…
data Expr' = App Expr Expr | If Expr Expr Expr
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE OverloadedLabels #-}
import GHC.TypeLits
import GHC.Exts
import Data.Kind
import GHC.OverloadedLabels
import Unsafe.Coerce
import Data.Proxy
data Pair a b = a `Of` b
type Variant :: [Pair Symbol Type] -> Type
data Variant spec = V Int Any
data N = Z | S N
type KeyIndexN :: Symbol -> [Pair Symbol Type] -> N
type family KeyIndexN k spec where
KeyIndexN k (k `Of` _ : _) = Z
KeyIndexN k (_ : ts) = S (KeyIndexN k ts)
type KeyIndex :: N -> Symbol -> [Pair Symbol Type] -> Constraint
class KeyIndex i k spec where
type KeyType i k spec :: Type
index :: Int
instance KeyIndex Z k (k `Of` t : ts) where
type KeyType Z k (k `Of` t : ts) = t
index = 0
instance KeyIndex n k ts => KeyIndex (S n) k (k' `Of` t : ts) where
type KeyType (S n) k (k' `Of` t : ts) = KeyType n k ts
index = index @n @k @ts + 1
mk :: forall k spec. KeyIndex (KeyIndexN k spec) k spec => KeyType (KeyIndexN k spec) k spec -> Variant spec
mk x = V (index @(KeyIndexN k spec) @k @spec) (unsafeCoerce x)
instance (KeyIndex n k spec, n ~ KeyIndexN k spec, t ~ KeyType n k spec) => IsLabel k (t -> Variant spec) where
fromLabel = mk @k @spec
instance Show (Variant '[]) where
show = undefined
instance (Show (Variant spec), KnownSymbol k, Show t) => Show (Variant (k `Of` t : spec)) where
show (V 0 x) = "#" ++ symbolVal (Proxy :: Proxy k) ++ " " ++ show (unsafeCoerce x :: t)
show (V i x) = show (V (pred i) x :: Variant spec)
type Expr = Variant
[ "Lit" `Of` Int
, "Plus" `Of` (Int, Int) ]
x, y :: Expr
x = #Lit 1
y = #Plus (1, 2)
main = do
print x
print y
Громоздко, по два типа на каждую штуку, матчить лишние конструкторы
Читать полностью…возникло желание обмазаться хаскелем, книга со слонёнком во имя добра пойдёт для вкатывания? программировать умею давно, отличить чистую функцию от чистовиртуальной могу
Читать полностью…а блин, тут рекурсия в тайп-алиасе, а заворачивание в ньютайп руинит все плюсы подхода
Читать полностью…ну сделать какой-нибудь
type Expr f =
Variant f ["Lit" := Int, "Plus" := (Expr f, Expr f)]
#Lit :: f Int -> Expr f
#Plus :: f (Expr f, Expr f) -> Expr f
и потом
x :: Expr (Location,)
x = #Plus (l, (#Lit (l, 42), #Lit (l, 0)))
ну это вот напрямую как в GHC
там
type LExpr = Localted Expr
data Expr
= Lit Int
| Plus LExpr LExpr
а еще я не очень понимаю (но я и не разбирался еще) как делать вложенный аст таким образом (выражения в стейтментах)
Читать полностью…