F#: Nullable <T> поддержка

public static boolean isBalanced(String s) {
    Map<Character, Character> openClosePair = new HashMap<Character, Character>();
    openClosePair.put('(', ')');
    openClosePair.put('{', '}');
    openClosePair.put('[', ']'); 

    Stack<Character> stack = new Stack<Character>();
    for (int i = 0; i < s.length(); i++) {

        if (openClosePair.containsKey(s.charAt(i))) {
            stack.push(s.charAt(i));

        } else if ( openClosePair.containsValue(s.charAt(i))) {
            if (stack.isEmpty())
                return false;
            if (openClosePair.get(stack.pop()) != s.charAt(i))
                return false;
        }

        // ignore all other characters

    }
    return stack.isEmpty();
}
23
задан Jonathan Allen 3 June 2009 в 19:51
поделиться

1 ответ

Боюсь, что в F # нет синтаксического сахара для типов, допускающих значение NULL (в отличие от C #, где вы просто добавляете ? к типу). Так что да, код, который вы там показываете, действительно выглядит ужасно подробным, но это единственный способ использовать тип System.Nullable в F #.

Однако я подозреваю, что вы действительно хотите быть используются типы опций . На странице MSDN есть несколько достойных примеров:

let keepIfPositive (a : int) = if a > 0 then Some(a) else None

и

open System.IO
let openFile filename =
   try
       let file = File.Open (filename, FileMode.Create)
       Some(file)
   with
       | exc -> eprintf "An exception occurred with message %s" exc.Message; None 

Очевидно, что их намного удобнее использовать!

Параметры, по сути, выполняют роль типов, допускающих значение NULL в F #, и я думаю, вы действительно хотите их использовать. чем типы, допускающие значение NULL (если вы не выполняете взаимодействие с C #). Разница в реализации состоит в том, что типы опций образуются размеченным объединением из Some (x) и None ,

22
ответ дан 29 November 2019 в 02:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: