Haskellで依存型プログラミングを面白くしようとしています。より具体的には、型セーフな検索操作です。Haskellの異種リストの型安全な参照の詳細
data Attr (xs :: [(Symbol,*)]) where
Nil :: Attr '[]
(:*) :: (Sing s, t) -> Attr xs -> Attr ('(s , t) ': xs)
と私は答え持っている:Previouslyは、私は次のデータ型のルックアップ操作を実装する方法について尋ねてきました
lookupAttr :: (Lookup s env ~ 'Just t) => Sing s -> Attr env -> t
lookupAttr s ((s', t) :* env') = case s %:== s' of
STrue -> t
SFalse -> lookupAttr s env'
正常に動作します。今、私は、型指定された構文の値の異質リストを定義する、種類Exp
によって表される:これらのデータ型を使用して
data Env (env :: [(Symbol,*)]) where
Nil :: Env '[]
Cons :: (Lookup s' env ~ 'Nothing) =>
(Sing s' ,
Exp ('(s', a) ': env) a) ->
Env env ->
Env ('(s',a) ': env)
、:
{-# LANGUAGE GADTs, TypeFamilies, DataKinds, TypeOperators, PolyKinds #-}
import Data.Singletons.Prelude.List
import Data.Singletons.Prelude.Bool
import Data.Singletons.Prelude.Eq
data Exp (env :: [(Symbol,*)]) :: * -> * where
Value :: String -> Exp env String
Var :: (Lookup s env ~ 'Just t) => Sing s -> Exp env t
Op :: Exp env t -> Exp env t -> Exp env t
異種のリスト型はEnv
データ型で定義されていますこれまでのところ
data Ex2 (p :: k -> k' -> *) where
Ex2 :: p e i -> Ex2 p
lookupEnv :: Lookup s env ~ 'Just t => Sing s -> Env env -> Ex2 Exp
lookupEnv s (Cons (s',e) env)
= case s %:== s' of
STrue -> Ex2 e
SFalse -> lookupEnv s env
:私は存在量化(タイプEx2
)のいくつかの並べ替えを使用してルックアップ関数を定義します、 とても良い。いくつかの面白い問題が発生しました:
1)lookupEnv
を定義する方法はありますか?このタイプの存在量の定量化は、タイプEx2
で提供されていますか?
2)入力項目を変更する操作を、Env
の値で定義するとします。この関数を定義するための明白な試みは、環境内の他に、いくつかの表現を構成する
modifyEnv :: Lookup s env ~ 'Just t => Sing s -> Exp env t -> Env env -> Env env
modifyEnv s e (Cons (s',e') env')
= case s %:== s' of
STrue -> Cons (s', Op e e') env'
SFalse -> Cons (s',e') (modifyEnv s e env')
機能modifyEnv
です。 この関数は、GHCによって受け入れられず、これは致命的なエラーメッセージを返します。どのように私はそのような修正関数を定義できますか?
こんにちは@Cactus!ご回答有難うございます!私は既に型付きのDeBruijnインデックスを使用することを検討しましたが、EDSLユーザーのために手作業で構築するのは少し複雑です(私の最終目標はEDSLを構築することです)。そのため、私はSymbolインデックス環境を使用しようとしています。 –