[英]Check the type of a variable in Haskell script
我正在寫一個基本的Haskell解釋器,有以下用例:有2個變量,var1和var2。
if( (typeOf var1 is Integer) and (typeOf var2 is Integer) ) then var1 + var2;
if( (typeOf var1 is String) and (typeOf var2 is String) ) then concatenate var1 to var2;
如何在Haskell中編寫它?
代碼的一部分:
evaluate:: Expr -> Env -> Val
evaluate expr env =
trace("expr= " ++ (show expr) ++ "\n env= " ++ (show env)) $
case expr of
Const v -> v
lhs :+: rhs ->
let valLhs = evaluate lhs env
valRhs = evaluate rhs env
in case () of
_ | <both are Integer> ->(IntVal $ (valToInteger valLhs) + (valToInteger valRhs))
| <both are String> -> (StringVal $ (valToString valLhs) ++ (valToString valRhs))
| otherwise....
我沒有Val
的定義,所以我不得不在這里猜測:
case (valLhs, valRhs) of
(IntVal i1, IntVal i2) -> IntVal $ i1 + i2
(StringVal s1, StringVar s2) -> ...
這是使用簡單模式匹配評估混合類型的示例。 這不是您問題的確切答案,但也許會對您有所幫助。
data Expr a = I Int
| S String
| V a
| Plus (Expr a) (Expr a)
deriving (Show)
type Env a = a -> Maybe (Expr a)
eval :: Env a -> Expr a -> Expr a
eval _ (I x) = I x
eval _ (S s) = S s
eval _ (Plus (I x) (I y)) = I (x + y)
eval _ (Plus (S x) (S y)) = S (x ++ y)
eval e (Plus (V v) y) = eval e (Plus (eval e (V v)) y)
eval e (Plus x (V v)) = eval e (Plus x (eval e (V v)))
eval _ (Plus _ _) = undefined
eval e (V v) = case e v of Just x -> x
Nothing -> undefined
env :: Char -> Maybe (Expr Char)
env 'a' = Just (I 7)
env 'b' = Just (I 5)
env 'c' = Just (S "foo")
env 'd' = Just (S "bar")
env _ = Nothing
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.