Помогите с Match
От: Ka3a4oK  
Дата: 25.11.07 13:48
Оценка:
match(l:list[string])
{
    |    '0'::tail    =>    WriteLine("ok"); //Значение головы нужно
    |    '1'::tail    =>    WriteLine("ok"); //Значение головы нужно
    |    '2'::tail    =>    WriteLine("ok"); //Значение головы нужно
    |    '3'::tail    =>    WriteLine("ok"); //Значение головы нужно
    |    '4'::tail    =>    WriteLine("ok"); //Значение головы нужно
    |    '5'::tail    =>    WriteLine("ok"); //Значение головы нужно
    |    _    =>    WriteLine("bad");
}


Можно ли сократить это выражение?

P.S.: Мне язык нравится все больше и больше.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Помогите с Match
От: Ka3a4oK  
Дата: 25.11.07 13:58
Оценка:
Дополнение: числа в скобках могут быть больше 9.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Помогите с Match
От: IT Россия linq2db.com
Дата: 25.11.07 20:47
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Можно ли сократить это выражение?


def l : list[string] = [];

match (l)
{
| "0" as h :: tail
| "1" as h :: tail
| "2" as h :: tail
| "3" as h :: tail
| "4" as h :: tail
| "5" as h :: tail => WriteLine("ok");
| _                => WriteLine("bad");
}

KK>P.S.: Мне язык нравится все больше и больше.

Дык
... << RSDN@Home 1.2.0 alpha rev. 717>>
Если нам не помогут, то мы тоже никого не пощадим.
Re: Помогите с Match
От: AngeL B. Россия  
Дата: 26.11.07 07:08
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Можно ли сократить это выражение?


def ok_list = ["0", "1", "2", "3"];   //а вот тут можно список правильных вариантов дописывать

//проверяем, что элемент находится в списке допустимых значений
def _check(item, ok_lst) {
  | (_, []) => false;
  | (item, (h :: tail)) => if( item == h ) true; else _check(item, tail);
}

match( l : list[string] ) {
  | (h :: _) when _check(h, ok_list) => WriteLine("ok");
  | _ => WriteLine("bad");
}
Re[2]: Помогите с Match
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.11.07 13:27
Оценка: 1 (1)
Здравствуйте, AngeL B., Вы писали:

AB>
AB>def ok_list = ["0", "1", "2", "3"];   //а вот тут можно список правильных вариантов дописывать
AB>


Согласен, только лучше вместо списка использовать Set. Его можно взять или в 3.5 фрэймворке (System.Collections.Generic.HashSet), подключив %ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll, или в пространстве имен Nemerle.Collections.Set.
def pattertns = System.Collections.Generic.HashSet(["1", "2", "3", "4"]);
//def pattertns = Nemerle.Collections.Set(["1", "2", "3", "4"]);
def res = match (["1"])
{
    | s :: _ when pattertns.Contains(s) => true
    | _ => false
}


Первй по шустрей так как основан на хэшировании, второй фунциональный, что позволяет хранить множество вариантов Set-а отличающихся одним-двумя элементами (без излишних трат памяти).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Помогите с Match
От: z00n  
Дата: 26.11.07 20:53
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Ka3a4oK, Вы писали:


KK>>Можно ли сократить это выражение?


IT>
IT>def l : list[string] = [];

IT>match (l)
IT>{
IT>| "0" as h :: tail
IT>| "1" as h :: tail
IT>| "2" as h :: tail
IT>| "3" as h :: tail
IT>| "4" as h :: tail
IT>| "5" as h :: tail => WriteLine("ok");
IT>| _                => WriteLine("bad");
IT>}
IT>


А так Nemerle допускает? Если нет, то студент, который писал для Nemerle паттерн матчинг — халтурно реализовал Or-patterns
match (l){
| "0"|"1"|"2"|"3"|"4"|"5" as h :: tail => WriteLine("ok")
| _ => WriteLine("bad")
}
Re[3]: Помогите с Match
От: IT Россия linq2db.com
Дата: 26.11.07 21:14
Оценка:
Здравствуйте, z00n, Вы писали:

Z>А так Nemerle допускает? Если нет, то студент, который писал для Nemerle паттерн матчинг — халтурно реализовал Or-patterns

Z>
Z>match (l){
Z>| "0"|"1"|"2"|"3"|"4"|"5" as h :: tail => WriteLine("ok")
Z>| _ => WriteLine("bad")
Z>}
Z>

Ты сам-то понял что написал?

Если же всё же отходить в сторону от поставленной задачи, то можно было написать так:

def bad()
{
    WriteLine("bad")
}

match (l){
| h :: tail => WriteLine("ok") =>
    match (h)
    {
    | "0"|"1"|"2"|"3"|"4"|"5" => WriteLine("ok")
    | _ => bad()
    }
| _ => bad()
}
... << RSDN@Home 1.2.0 alpha rev. 717>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Помогите с Match
От: z00n  
Дата: 27.11.07 02:55
Оценка:
Здравствуйте, IT, Вы писали:

Z>>
Z>>match (l){
Z>>| "0"|"1"|"2"|"3"|"4"|"5" as h :: tail => WriteLine("ok")
Z>>| _ => WriteLine("bad")
Z>>}
Z>>

IT>Ты сам-то понял что написал?

Берем Ocaml:
let test lst = 
  match lst with
  | "1"|"2"|"3"|"4"|"5" as h::tail -> h ^ ", ok" 
  | _ -> "bad"
  ;

# 
        val test : string list -> string = <fun>
# test ["1";"33";"35"];;
- : string = "1, ok"
# test ["3";"33";"35"];;
- : string = "3, ok"
# test ["5";"33";"35"];;
- : string = "5, ok"
# test ["6";"33";"35"];;
- : string = "bad"


Резюмируя — есть на свете языки, где оператор `|` можно использовть между любыми паттернами, а не только между верхнеуровневыми guerded_patterns(в терминологии Nemerle). Nemerle не из таких, что само по себе не ужасно — у Haskell, например, тоже нет or-patterns, а у SML по стандарту 97 года нет даже гардов.


IT>Если же всё же отходить в сторону от поставленной задачи, то можно было написать так:


IT>
IT>def bad()
IT>{
IT>    WriteLine("bad")
IT>}

IT>match (l){
IT>| h :: tail => WriteLine("ok") =>
IT>    match (h)
IT>    {
IT>    | "0"|"1"|"2"|"3"|"4"|"5" => WriteLine("ok")
IT>    | _ => bad()
IT>    }
IT>| _ => bad()
IT>}
IT>


А такое?
let test3 lst =
  match lst with
  | ("1"|"2" as a)::("3"|"4" as b)::("5"|"6" as c)::tail -> a ^ b ^ c
  | _ -> "bad"
;;

# test3 ["1";"2";"3"];;
- : string = "bad"
# test3 ["1";"4";"5"];;
- : string = "145"
Re[3]: Помогите с Match
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.11.07 05:29
Оценка:
Здравствуйте, z00n, Вы писали:

Z>А так Nemerle допускает? Если нет, то студент, который писал для Nemerle паттерн матчинг — халтурно реализовал Or-patterns

Z>
Z>match (l){
Z>| "0"|"1"|"2"|"3"|"4"|"5" as h :: tail => WriteLine("ok")
Z>| _ => WriteLine("bad")
Z>}
Z>


Студент, который к слову уже PhD, взял алгоритм разработанный для ML-я. Вот кусок коментария из файла http://nemerle.org/svn/nemerle/trunk/ncc/typing/DecisionTreeBuilder.n :

The algorithm used here is based on the ``ML pattern match compilation
and partial evaluation'' by Peter Sestoft, available at:

http://www.dina.kvl.dk/~sestoft/papers/match.ps.gz
...

Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Помогите с Match
От: IT Россия linq2db.com
Дата: 27.11.07 20:24
Оценка:
Здравствуйте, z00n, Вы писали:

Z>Резюмируя — есть на свете языки, где оператор `|` можно использовть между любыми паттернами, а не только между верхнеуровневыми guerded_patterns(в терминологии Nemerle). Nemerle не из таких, что само по себе не ужасно — у Haskell, например, тоже нет or-patterns, а у SML по стандарту 97 года нет даже гардов.


Дело не в языках. Дело в том, что это уже невозможно просто читать. Одно из достоинств ПМ как раз улучшить читаемость кода и распутать запутанные алогоритмы. А тут ситуация в точности обратная.
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Помогите с Match
От: z00n  
Дата: 27.11.07 21:16
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, z00n, Вы писали:


IT>Дело не в языках. Дело в том, что это уже невозможно просто читать. Одно из достоинств ПМ как раз улучшить читаемость кода и распутать запутанные алогоритмы. А тут ситуация в точности обратная.


Мне не кажется, что or-patterns ухудшают читабельность, скорее наоборот. Любые or-patterns можно расписать — по клаузе на каждый случай(как вы и продемонстрировали) — но странно делать это руками, если есть компилятор. Связывание or-patterna c переменной в Ocaml с непривычки выглядит и впрямь несколько странно, но можно скобки добавить.
Re[4]: Помогите с Match
От: z00n  
Дата: 27.11.07 21:33
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Студент, который к слову уже PhD, взял алгоритм разработанный для ML-я. Вот кусок коментария из файла http://nemerle.org/svn/nemerle/trunk/ncc/typing/DecisionTreeBuilder.n :

VD>

VD>The algorithm used here is based on the ``ML pattern match compilation
VD>and partial evaluation'' by Peter Sestoft, available at:

VD> http://www.dina.kvl.dk/~sestoft/papers/match.ps.gz
VD>...


Да, спасибо, я знаю, и даже разбирался с этим самым алгоритмом для своих целей. Он годится для любого языка, даже статическая типизация влияет лишь на одну оптимизацию (span). Для ML он лишь в том смысле, что в бумаге описано лишь как компилировать VarPattern и ConstructorPattern — AsPattern, Guards и TypeConstraintPattern студенту пришлось придумывать самому. Мое замечание имело в виду, что на OrPattern он явно спасовал (при том, что разрешил опускать одинаковую правую часть у паттернов верхнего уровня)
Re[7]: Помогите с Match
От: IT Россия linq2db.com
Дата: 28.11.07 00:53
Оценка:
Здравствуйте, z00n, Вы писали:

IT>>Дело не в языках. Дело в том, что это уже невозможно просто читать. Одно из достоинств ПМ как раз улучшить читаемость кода и распутать запутанные алогоритмы. А тут ситуация в точности обратная.


Z>Мне не кажется, что or-patterns ухудшают читабельность, скорее наоборот. Любые or-patterns можно расписать — по клаузе на каждый случай(как вы и продемонстрировали) — но странно делать это руками, если есть компилятор. Связывание or-patterna c переменной в Ocaml с непривычки выглядит и впрямь несколько странно, но можно скобки добавить.


Вполне допускаю, что это дело привычки и на таком простом варианте это выглядит в общем-то ещё ничего. Я просто думаю о том, куда может разыграться фантазия и как с этим потом бороться.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: Помогите с Match
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.11.07 08:51
Оценка: +1
Здравствуйте, z00n, Вы писали:

Z>Мне не кажется, что or-patterns ухудшают читабельность, скорее наоборот. Любые or-patterns можно расписать — по клаузе на каждый случай(как вы и продемонстрировали) — но странно делать это руками, если есть компилятор. Связывание or-patterna c переменной в Ocaml с непривычки выглядит и впрямь несколько странно, но можно скобки добавить.


Со скобками было бы ничего (логично и понятно). А так, откровенно говоря вводит в заблуждение.
Что касается привычек, то когда в языке к слишком многому нужно привыкать, то язык становится сложным для изучения. Это беда большинства ФЯ. Очень не хотелось бы, чтобы новые гибриды так же страдали этим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Помогите с Match
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.11.07 08:55
Оценка:
Здравствуйте, z00n, Вы писали:

Z>Мое замечание имело в виду, что на OrPattern он явно спасовал (при том, что разрешил опускать одинаковую правую часть у паттернов верхнего уровня)


ОК.
1. Можно спросить почему так прямо у "студента".
2. Можно внести фича-реквест в багтрекер (только, на мой взгляд, лучше в обязательном порядке использовать скобки) и ждать пока его реализуют, или даже попытаться сделать это самостоятельно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.