Преобразование функции Haskell в SML

Я пытаюсь преобразовать функцию 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. Может ли кто-нибудь, кто более опытен, помочь мне с этим?


person TheAptKid    schedule 06.12.2013    source источник


Ответы (1)


Это было бы

val bracket =
  if dCntxt > dHere
  then fn s => "(" ^ s ^ ")"
  else fn x => x

Функция сравнивает уровень приоритета вашего контекста с уровнем приоритета внешнего оператора вашего выражения и решает, вставлять ли пару круглых скобок вокруг данной строки или нет.

person kosmikus    schedule 06.12.2013
comment
Это можно улучшить, используя List.concat в SML, чтобы избежать двойного повторения s с использованием ^. - person Mokosha; 07.12.2013