首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCaml交互错误,关于“FunCall R”的争论太多了

OCaml交互错误,关于“FunCall R”的争论太多了
EN

Stack Overflow用户
提问于 2019-01-10 17:07:19
回答 1查看 77关注 0票数 0

我正在编写一种与OCaml语言交互的语言。

使用ApplyOver,我必须在类型字典的每个值上映射一个函数,它由(ide * exp) -> ("key",value)组成。

如果该函数是字典("key1",Eint 2)上的“趣味x-> Eint”,("key2",Eint 3),那么ApplyOver将添加+1到2和+1到3。

我在最后一行出现了这个错误,这个函数有exp -> evT env -> evT类型--它应用于太多的参数;也许您忘记了‘;’.

代码(没有标准评价):

代码语言:javascript
复制
type exp = ... | Dict of (ide * exp) list | ApplyOver of exp * exp;;
type evT = ... | DictVal of (ide * exp) list

let rec eval (e : exp) (r : evT env) : evT = match e with

Dict(pairs) -> 
    if invariant pairs then DictVal(evalDictList pairs r) 
    else failwith("The Dictionary has multiple copy of the same key")|
ApplyOver(ex, dict) ->
    (match (eval dict r) with
        DictVal(pairs) -> DictVal(applyover ex pairs)|
        _-> failwith ("not a dictionary"))|
Estring s -> String s |
Eint n -> Int n |
Ebool b -> Bool b |
IsZero a -> iszero (eval a r) |
Den i -> applyenv r i |
Eq(a, b) -> eq (eval a r) (eval b r) |
Prod(a, b) -> prod (eval a r) (eval b r) |
Sum(a, b) -> sum (eval a r) (eval b r) |
Diff(a, b) -> diff (eval a r) (eval b r) |
Minus a -> minus (eval a r) |
And(a, b) -> et (eval a r) (eval b r) |
Or(a, b) -> vel (eval a r) (eval b r) |
Not a -> non (eval a r) |
Ifthenelse(a, b, c) -> 
    let g = (eval a r) in
        if (typecheck "bool" g) 
            then (if g = Bool(true) then (eval b r) else (eval c r))
            else failwith ("nonboolean guard") |
Let(i, e1, e2) -> eval e2 (bind r i (eval e1 r)) |
Fun(i, a) -> FunVal(i, a, r) |
FunCall(f, eArg) -> 
    let fClosure = (eval f r) in
        (match fClosure with
            FunVal(arg, fBody, fDecEnv) -> 
                eval fBody (bind fDecEnv arg (eval eArg r)) |
            RecFunVal(g, (arg, fBody, fDecEnv)) -> 
                let aVal = (eval eArg r) in
                    let rEnv = (bind fDecEnv g fClosure) in
                        let aEnv = (bind rEnv arg aVal) in
                            eval fBody aEnv |
            _ -> failwith("non functional value")) |
    Letrec(f, funDef, letBody) ->
            (match funDef with
                Fun(i, fBody) -> let r1 = (bind r f (RecFunVal(f, (i, fBody, r)))) in
                                                eval letBody r1 |
                _ -> failwith("non functional def"))

and evalDictList (pairs : (ide * exp) list) (r : evT env) : (ide * evT) list = match pairs with
    [ ] -> [ ] |
    (key,value) :: other -> (key, eval value r) :: evalDictList other r

and applyover (ex : exp) (listtoscan : (ide * evT) list) : (ide * evT) list = match listtoscan with
    [ ] -> [ ] |
    (key,value) :: other -> (key, eval FunCall(ex, value) r) :: applyover ex other;;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-10 17:16:22

函数应用程序的优先级仅次于方法调用(以及类似的用户定义操作符)。因此,编译器将eval FunCall(ex, value) r读入

代码语言:javascript
复制
 (eval FunCall) (ex, value) r

当你打算写

代码语言:javascript
复制
 eval (Funcall(ex,value)) r
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54133650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档