[F# ] Паттерн матчинг
От: cadet354 Россия
Дата: 06.10.09 07:49
Оценка:
Доброго времени,
не понятно как работает патерн матчинг, например надо различать что пришло, tuple или что-то другое,
почему в msg1: This rule will never be matched
let tst =  fun message ->
                match message with
                | To, msg       ->  printf "tuple"
                | msg1          ->  printf "object"

в эрланге подобная конструкция работает:
fun_test (Y) ->
    case Y of
        {To, Message}     -> tuple;
        Message                    -> not_tuple
    end.
... << RSDN@Home 1.2.0 alpha 4 rev. 1231>>
Re: [F# ] Паттерн матчинг
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.10.09 08:20
Оценка:
Здравствуйте, cadet354, Вы писали:

C>Доброго времени,

C>не понятно как работает патерн матчинг, например надо различать что пришло, tuple или что-то другое,
C>почему в msg1: This rule will never be matched
C>
C>let tst =  fun message ->
C>                match message with
C>                | To, msg       ->  printf "tuple"
C>                | msg1          ->  printf "object"
C>

Потому как при выводе типа компилятор приходит к тому, что message будет туплом, и подать туда не тупл будет нереально.
Re: [F# ] Паттерн матчинг
От: crable США  
Дата: 06.10.09 08:20
Оценка:
Здравствуйте, cadet354, Вы писали:

C>Доброго времени,

C>не понятно как работает патерн матчинг, например надо различать что пришло, tuple или что-то другое,
C>почему в msg1: This rule will never be matched
C>
C>let tst =  fun message ->
C>                match message with
C>                | To, msg       ->  printf "tuple"
C>                | msg1          ->  printf "object"
C>


Так в F# у тебя статическая типизация. Тип tst — 'a * 'b -> unit, значит msg1 будет означать целый кортеж, а в предыдущей строке у тебя тот же кортеж только разделённый на 2 части, поэтому до следующей строки сопоставление не дойдёт, о чём и предупреждает компилятор.

[snip]
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: [F# ] Паттерн матчинг
От: nikov США http://www.linkedin.com/in/nikov
Дата: 06.10.09 08:21
Оценка:
Здравствуйте, cadet354, Вы писали:

C>Доброго времени,

C>не понятно как работает патерн матчинг, например надо различать что пришло, tuple или что-то другое,
C>почему в msg1: This rule will never be matched
C>
C>let tst =  fun message ->
C>                match message with
C>                | To, msg       ->  printf "tuple"
C>                | msg1          ->  printf "object"
C>


Потому что F# статически типизированный язык. На этапе компиляции определяется, что message — это кортеж, так как он сопоставляется с образцом для кортежа. Следовательно, первая ветка дает исчерпывающий match.
Re: [F# ] Паттерн матчинг
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 06.10.09 08:23
Оценка:
Здравствуйте, cadet354, Вы писали:

C>Доброго времени,

C>не понятно как работает патерн матчинг, например надо различать что пришло, tuple или что-то другое,
C>почему в msg1: This rule will never be matched
C>
C>let tst =  fun message ->
C>                match message with
C>                | To, msg       ->  printf "tuple"
C>                | msg1          ->  printf "object"
C>

C>в эрланге подобная конструкция работает:
C>
C&gt;fun_test (Y) -&gt;
C&gt;    case Y of
C&gt;        {To, Message}     -&gt; tuple;
C&gt;        Message                    -&gt; not_tuple
C&gt;    end.
C&gt;


Потому что f# статически типизирован и тип аргумента (и результата) матча выводится по первому шаблону.
У тебя в первом шаблоне указан кортеж из двух элементов, бех дополнительных ограничений он будет ловить все возможные значения.
Поэтому до второго шаблона дело и не дойдет
Re: [F# ] Паттерн матчинг
От: Warturtle  
Дата: 06.10.09 08:31
Оценка: 5 (2)
Здравствуйте, cadet354, Вы писали:

C>Доброго времени,

C>не понятно как работает патерн матчинг, например надо различать что пришло, tuple или что-то другое,
C>почему в msg1: This rule will never be matched
C>
C>let tst =  fun message ->
C>                match message with
C>                | To, msg       ->  printf "tuple"
C>                | msg1          ->  printf "object"
C>

C>в эрланге подобная конструкция работает:
C>
C&gt;fun_test (Y) -&gt;
C&gt;    case Y of
C&gt;        {To, Message}     -&gt; tuple;
C&gt;        Message                    -&gt; not_tuple
C&gt;    end.
C&gt;

Может надо завести discrimanted union

type Message =  
    | FromBody of string * string 
    | Body of string;;

let tst = fun message ->
    match message with
        | FromBody(To, msg) ->  printf "tuple"
        | Body(msg1)        ->  printf "object"

— как-то так.
Re[2]: [F# ] Паттерн матчинг
От: cadet354 Россия
Дата: 06.10.09 08:41
Оценка:
Здравствуйте, Warturtle, Вы писали:

W>Может надо завести discrimanted union


W>
W>type Message =  
W>    | FromBody of string * string 
W>    | Body of string;;

W>let tst = fun message ->
W>    match message with
W>        | FromBody(To, msg) ->  printf "tuple"
W>        | Body(msg1)        ->  printf "object"
W>

W>- как-то так.
спасибо всем так и сделаю, не думал что мой опыт в ерланге будет мешать в изучении F#
... << RSDN@Home 1.2.0 alpha 4 rev. 1231>>
Re[3]: [F# ] Паттерн матчинг
От: thesz Россия http://thesz.livejournal.com
Дата: 06.10.09 09:13
Оценка: :)
Здравствуйте, cadet354, Вы писали:

C>спасибо всем так и сделаю, не думал что мой опыт в ерланге будет мешать в изучении F#


О!

Ценное свидетельство!

Оказывается, опыт в Эрланге может мешать изучать функциональное программирование.

Запомню. Буду использовать.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[3]: [F# ] Паттерн матчинг
От: Пельмешко Россия blog
Дата: 06.10.09 09:25
Оценка:
Здравствуйте, cadet354, Вы писали:

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


W>>Может надо завести discrimanted union


W>>
W>>type Message =  
W>>    | FromBody of string * string 
W>>    | Body of string;;

W>>let tst = fun message ->
W>>    match message with
W>>        | FromBody(To, msg) ->  printf "tuple"
W>>        | Body(msg1)        ->  printf "object"
W>>

W>>- как-то так.

Чуть проще:
let tst = function
    | FromBody(To,msg) -> printf "tuple"
    | Body(msg1)       -> printf "object"
Re[4]: [F# ] Паттерн матчинг
От: Jack128  
Дата: 06.10.09 09:28
Оценка: 1 (1) +1
Здравствуйте, thesz, Вы писали:

T>Оказывается, опыт в Эрланге может мешать изучать функциональное программирование.


Лудше сформулировать так: опыт динамических языков мешает при работе со статически типизированными языками.
Re[5]: [F# ] Паттерн матчинг
От: thesz Россия http://thesz.livejournal.com
Дата: 06.10.09 09:38
Оценка:
Здравствуйте, Jack128, Вы писали:

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


T>>Оказывается, опыт в Эрланге может мешать изучать функциональное программирование.


J>Лудше сформулировать так: опыт динамических языков мешает при работе со статически типизированными языками.


А наоборот бывает, интересно?

PS
Кстати, первое, с чем я столкнулся, это с бесконечными типами.

Я хотел написать что-то вроде f (c:cs) = if c == ' ' then (True, f cs) else (False, undefined) и получил сообщение об ошибке "бесконечный тип". Долго думал, что же не так, даже отложил использование на потом.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[6]: [F# ] Паттерн матчинг
От: MigMit Россия http://migmit.vox.com
Дата: 06.10.09 18:09
Оценка:
Здравствуйте, thesz, Вы писали:

J>>Лудше сформулировать так: опыт динамических языков мешает при работе со статически типизированными языками.


T>А наоборот бывает, интересно?


Не знаю, считается ли, но я не смог прочитать SICP частично именно из-за этого. Всякий раз, когда они излагают очередную конструкцию, я представляю себе, как оно ёбнется, когда на вход случайно поступит что-нибудь не то.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.