将Haskell函数转换为SML
我正在尝试将显示布尔公式的Haskell函数转换为SML函数 职能:将Haskell函数转换为SML,haskell,functional-programming,sml,smlnj,Haskell,Functional Programming,Sml,Smlnj,我正在尝试将显示布尔公式的Haskell函数转换为SML函数 职能: data Formula = Atom String | Neg Formula | Conj Formula Formula | Disj Formula Formula precedence :: Formula -> Int precedence Atom{} = 4 precedence Neg {} = 3 precedence Conj{} = 2 precedence D
data Formula
= Atom String
| Neg Formula
| Conj Formula Formula
| Disj Formula Formula
precedence :: Formula -> Int
precedence Atom{} = 4
precedence Neg {} = 3
precedence Conj{} = 2
precedence Disj{} = 1
displayPrec :: Int -> Formula -> String
displayPrec dCntxt f = bracket unbracketed where
dHere = precedence f
recurse = displayPrec dHere
unbracketed = case f of
Atom s -> s
Neg p -> "~ " ++ recurse p
Conj p q -> recurse p ++ " & " ++ recurse q
Disj p q -> recurse p ++ " | " ++ recurse q
bracket
| dCntxt > dHere = \s -> "(" ++ s ++ ")"
| otherwise = id
display :: Formula -> String
display = displayPrec 0
我已经把它翻译成了SML:
fun precedence(operator) =
case operator of
Atom a => 4
| Neg p => 3
| Conj(p,q) => 2
| Disj(p,q) => 1
fun displayPrec dCntxt f =
let
val dHere = precedence f
val recurse = displayPrec dHere
val unbracketed = case f of
Atom a => a
| Neg p => "~ " ^ recurse p
| Conj(p,q)=>(recurse p) ^ " & " ^ (recurse q)
| Disj(p,q)=>(recurse p) ^ " | " ^ (recurse q)
(* missing bracket function *)
in
(* bracket *) unbracketed
end
无支撑函数可以工作。它显示了不带大括号的公式。唯一仍然缺少的是括号函数,我不知道它是做什么的,也不知道如何将它转换为SML。有经验的人能帮我吗?那太好了
val括号=
如果dCntxt>dHere
然后fn s=>“(^s^”)”
否则fn x=>x
函数将上下文的优先级与表达式外部运算符的优先级进行比较,并决定是否在给定字符串周围插入一对括号。这可以通过在SML中使用
List.concat
来改进,以避免使用^
在s
上重复两次