単純なDSLを実装するためにいくつかのHaskell拡張を使用しようとしています。私が望む機能は、変数の型レベルのコンテキストを持つことです。 私は、この種のものはAgdaやIdrisのような言語で一般的な場所であることを知っています。しかし、私はハスケルで同じ結果を達成することが可能かどうかを知りたいと思います。Haskellの型レベル環境
私の考えは、タイプレベルの関連付けリストを使用することです。コードは以下の通りである:それは与えられた環境env
上にある場合、変数にのみ使用することができることを確実にするために使用されるIn
モデルタイプレベルリストのメンバーシップの制約
{-# LANGUAGE GADTs,
DataKinds,
PolyKinds,
TypeOperators,
TypeFamilies,
ScopedTypeVariables,
ConstraintKinds,
UndecidableInstances #-}
import Data.Proxy
import Data.Singletons.Prelude
import Data.Singletons.Prelude.List
import GHC.Exts
import GHC.TypeLits
type family In (s :: Symbol)(a :: *)(env :: [(Symbol, *)]) :: Constraint where
In x t '[] =()
In x t ('(y,t) ': env) = (x ~ y , In x t env)
data Exp (env :: [(Symbol, *)]) (a :: *) where
Pure :: a -> Exp env a
Map :: (a -> b) -> Exp env a -> Exp env b
App :: Exp env (a -> b) -> Exp env a -> Exp env b
Set :: (KnownSymbol s, In s t env) => proxy s -> t -> Exp env()
Get :: (KnownSymbol s, In s t env) => proxy s -> Exp env t
test :: Exp '[ '("a", Bool), '("b", Char) ] Char
test = Get (Proxy :: Proxy "b")
タイプファミリー。私はGHCの7.10.3を使用してい
Could not deduce (In "b" Char '['("a", Bool), '("b", Char)])
arising from a use of ‘Get’
In the expression: Get (Proxy :: Proxy "b")
In an equation for ‘test’: test = Get (Proxy :: Proxy "b")
Failed, modules loaded: Main.
:
問題はGHCの制約ソルバーは、次のエラーメッセージを与えて、test
機能に制約 In "b" Char [("a",Bool), ("b",Char)]
を必要とすることはできないということです。どのように私はこれを解決することができますか、またはこれが不可能である理由の説明のヒントは非常に歓迎です。
あなたは多くの怒っているForthプログラマーを獲得しようとしています! – dfeuer