Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Haskell函数转换为SML_Haskell_Functional Programming_Sml_Smlnj - Fatal编程技术网

将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

我正在尝试将显示布尔公式的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 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
上重复两次