Lan*_*ana 5 haskell type-theory type-inference lambda-calculus unification
我在haskell中具有以下结构,该结构实现了一些用于打印的机制并调用了统一器。我从main收到以下错误:
0 =/= int
Run Code Online (Sandbox Code Playgroud)
似乎认为0是数字而不是变量。以下是完整的实现。
data CType
= CVar Int
| CArr CType CType
| CInt
| CBool
deriving (Eq, Data)
data Constraint
= Equality CType CType
deriving (Eq, Data)
Run Code Online (Sandbox Code Playgroud)
我有一些基本类型(int和bool),箭头类型和类型变量。然后,我运行一些生成相等约束的算法,这些约束以上述方式表示。
我的目标是给定约束列表,我想找到最通用的统一器。
我遇到了这个库:http : //hackage.haskell.org/package/compdata-0.1/docs/Data-Comp-Unification.html
由于我是Haskell的新手,所以我无法立即弄清楚是否可以直接应用它。我可以使用该库还是建议从头开始编写统一器?
更新
我目前正在对代码进行以下更改,但方程式出现统一错误
f =克
module SolveEq where
import Data.Data
import Data.Void
import Data.List as List
import Data.Map as Map
import Data.Set as Set
import Data.Maybe (fromJust)
import Data.Maybe (isJust)
import Control.Monad
import TypeCheck
import Data.Comp.Variables
import Data.Comp.Unification
import Data.Comp.Term
import Data.Comp.Derive
import Constraint
import Lang
data CTypeF a
= CVarF Int
| CArrF a a
| CIntF
| CBoolF
deriving (Data, Functor, Foldable, Traversable, Show, Eq)
$(makeShowF ''CTypeF)
example :: String
example = showF (CIntF :: CTypeF String)
instance HasVars CTypeF Int where
isVar (CVarF x) = Just x
isVar (CArrF x y) = Nothing
isVar CIntF = Nothing
isVar CBoolF = Nothing
type CType_ = Term CTypeF
f :: CType_
f = Term (CVarF 0)
g :: CType_
g = Term CIntF
unravel :: CType_ -> CType
unravel a =
case unTerm a of
CVarF i -> CVar i
CArrF a b -> CArr (unravel a) (unravel b)
CIntF -> CInt
CBoolF -> CBool
getUnify :: Either (UnifError CTypeF Int) (Subst CTypeF Int)
getUnify = unify [(f,g)]
main = case getUnify of
Left (FailedOccursCheck v term) -> putStrLn ("failed occurs check " ++ show v ++ ": " ++ (show $ unravel term))
Left (HeadSymbolMismatch t1 t2) -> putStrLn ("head symbol mismatch " ++ show (unravel t1) ++ " =/= " ++ (show $ unravel t2))
Left (UnifError str) -> putStrLn str
Right (subst :: Subst CTypeF Int) -> print (fmap unravel subst)
Run Code Online (Sandbox Code Playgroud)
问题是unify [(f,g)]我期望将0映射到Int。但是似乎看不到0是变量。我的isVar可能有问题吗?
注意:我正在运行compdata-0.12