- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
import Data.List
import Data.Maybe
checkBraces "" = True
checkBraces e = checkBrace e [] where
openBraces = "({["
closeBraces = ")}]"
braceToBrace fromBraces toBraces brace = toBraces!!(fromJust $ elemIndex brace fromBraces)
otcBrace = braceToBrace openBraces closeBraces
checkBrace (c:e) s | elem c openBraces = checkBrace e ((otcBrace c):s)
checkBrace (c:e) (h:s) | (elem c closeBraces) && (h==c) = checkBrace e s
checkBrace (_:e) _ = False
checkBrace [] [] = True
checkBrace [] _ = False
main = mapM_ (print . checkBraces) bracesExpressionExamples where
bracesExpressionExamples =
[
"({[{}]{}[]})",
"({}}{[{}]{}[]})",
"({[{}]{}[]}",
"({[{}]{}]})",
"({[{}{}[]})",
"",
"{}"
]
USB 05.03.2014 23:19 # −2
Stertor 05.03.2014 23:57 # +5
Мяу!
unu-foja 06.03.2014 02:04 # +2
> openBraces = "({[" ... лучше [('(',')'), ... ] или свой Pair '(' ')'
не было бы неидиоматичного !! + elemIndex, непонятно, почему не используются преимущества языка
для сравнения (правда древний "hugs"): http://codepad.org/8GKpGQws - тут тоже пропущено, но если код не одноразовый, должны быть сигнатуры
USB 06.03.2014 08:39 # +1
USB 06.03.2014 09:57 # 0
Согласен. Очень чужеродно.
Вот если бы он написал как вы говорите - ещё можно было бы подумать его взять:
http://ideone.com/1OIrFf
А так он даже умение пользоваться монадами не продемонстрировал.
Ещё заметьте, в своем коде случаи:
checkBrace "" [] = True
checkBrace "" _ = False
вместо "" он написал [], что явно не так читабильно