Здравствуйте, VladD2, Вы писали:
ВВ>>...По-моему не такие уж большие отличия по синтаксису.
VD>Дык ты в основном пользовался алгебраическими типами которые у обоих языков позаимствованы из ML-я. Если в Немерле еще указать "#pragma indent", то вообще очень похоже будет.
Вот тут есть интересный момент. Как только на Немерле начинаешь писать в функциональном стиле, то он плавным движением руки превращается в ML.
А вот у той же Скалы совсем другая философия — она вообще выглядит так, как будто в ней функциональные конструкции имитируются через ООП. Даже не знаю, как сказать точно. Может быть, некоторых пугает такая двойственность Немерле
ВВ>>Хотя вот почему-то он меня заставил аннотацию типа для функции написать
VD>Кто? F#?
Ну да.
ВВ>>А вот если писать на F# в стиле class based OOP это будет, конечно, кошмар
VD>Ага. С ФП у него намного лучше чес с ООП и МП. Это следствие того, что язык не проектировался с нуля, а является адаптацией OCaml-а. У создателей OCaml-а был свой, весьма своеобразный взгляд на ООП (функциональный).
Да вообще с их явным порядком файлов и плоской структурой проекта что-то большое на F# писать запаришься.
ЗЫ. Кстати, вот как выглядит вышепоказанный пример на моем интерпретаторе:
let (V, Q, K, T) = (13, 14, 15, 16);
type Card = Plain(v) | High(v);
let GetCardRank = c ->
match (c)
| Plain(v) -> v
| High(v) -> v;
type Comb =
Single(c) | Pair(c) | TwoPair(p1, p2) | Three(c) | Street(c)
| Flush(c) | Full(c) | Four(c) | StreetFlush(c);
let GetRank = cc ->
match (cc)
| Single(c) -> GetCardRank(c)
| TwoPair(p1, p2) -> GetRank(p1) + GetRank(p2)
| Pair(c) with r = 0x20
| Three(c) with r = 0x80
| Street(c) with r = 0x100
| Flush(c) with r = 0x200
| Full(c) with r = 0x300
| Four(c) with r = 0x400
| StreetFlush(c) with r = 0x500 -> GetCardRank(c) + r;
let CalcRank = l -> match(l)
| [] -> 0 | x::xs -> GetRank(x) + CalcRank(xs);
let cards = Comb.Pair(Card.High(V)) ::
Comb.Single(Card.High(Q)) ::
Comb.Single(Card.Plain(6)) ::
Comb.Single(Card.High(T)) :: [];
CalcRank(cards);