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();
}
Боюсь, что в 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
,