Доброго времени,
не понятно как работает патерн матчинг, например надо различать что пришло, tuple или что-то другое,
почему в msg1: This rule will never be matched
let tst = fun message ->
match message with
| To, msg -> printf "tuple"
| msg1 -> printf "object"
Здравствуйте, 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 будет туплом, и подать туда не тупл будет нереально.
Здравствуйте, 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.
Здравствуйте, 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.
Здравствуйте, 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# статически типизирован и тип аргумента (и результата) матча выводится по первому шаблону.
У тебя в первом шаблоне указан кортеж из двух элементов, бех дополнительных ограничений он будет ловить все возможные значения.
Поэтому до второго шаблона дело и не дойдет
Здравствуйте, 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>
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"
Здравствуйте, 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)
Здравствуйте, thesz, Вы писали:
J>>Лудше сформулировать так: опыт динамических языков мешает при работе со статически типизированными языками.
T>А наоборот бывает, интересно?
Не знаю, считается ли, но я не смог прочитать SICP частично именно из-за этого. Всякий раз, когда они излагают очередную конструкцию, я представляю себе, как оно ёбнется, когда на вход случайно поступит что-нибудь не то.