mizunashi-mana
aはアノテーションにして,型情報とかを入れたい感じですか?
構文木を評価した結果の型を以下のようにして、型の構造はシンプルなままにして外側から注釈をつけられるような Functor として扱えないかなって取り組んでみたのです
hs data ValF a = Unit | Bool Bool | Integer Integer | List [a] | Func ([a] -> Either Error a)
Func
にあてがう用途に足したのですが、この時点でFunctorの導出は出来ないなって気づいてFunc
の型の意味がよく分かってないんですが, ([a], Either Error a)
ではなくて関数型なんです?newtype Fix f = Fix (f (Fix f))
でラップすると、外側から中に注釈を差し込めるっていう感じですFunc
はhaskellの方で実装しているビルトイン関数本体を渡すように考えていて eval する時にそれを適用させてインタプリタを実装する、という目論見でした。LispVal
のように、関数をメンバーに持たせて、apply の型を Val -> [Val] -> Either Error Val
という風にしたかったtype Val = Fix ValF eval :: Val -> Either Error Val ... eval (FunApp name xs) = buildinf name xs
LocatedVal
とか TypedVal
とかを作っても同様の事が出来はするんですが、ボイラープレートの山が出来るし…... | Func ([Val] -> Either Error Val) apply (Func f) args = <argsから注釈抜いて[Val]に変換したのを適用する>