F#

Aug. 19th, 2010 05:00 pm
109: (Default)
[personal profile] 109
начал изучать F# сегодня после обеда. похоже, что к концу дня уже и закончил. никакой дополнительной гибкости по сравнению с C# не наблюдается. взять tuples. ок, я могу сматчить первый элемент как (x, _), аналогично head в списке. а как мне сматчить остаток (e.g. tail)? или как итерировать по тупелу заранее неизвестного типа? или как динамически создать тупел, имея, скажем, список типов элементов? а ведь без перечисленного мной ничего осмысленно реляционного не написать. вот у них ничего не пошевелилось в душе, когда они хуярили эти конструкторы?

Tuple(T1)
Tuple(T1, T2)
Tuple(T1, T2, T3)
Tuple(T1, T2, T3, T4)
Tuple(T1, T2, T3, T4, T5)
Tuple(T1, T2, T3, T4, T5, T6)
Tuple(T1, T2, T3, T4, T5, T6, T7)
Tuple(T1, T2, T3, T4, T5, T6, T7, T8)


bonus: Action(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)

видимо, Билл Гейтс сказал, что 16 параметров должно быть достаточно для любого метода.

(no subject)

Date: 2010-08-20 09:35 am (UTC)
From: [identity profile] zamotivator.livejournal.com
я не вижу, почему так принципиально трудно сделать нормальную языковую поддержку для операции, например, [int; string] -> int * string - при том что, как ты сам правильно заметил, сделать это через reflection не представляет проблем (unless число элементов в списке типов больше восьми ;)..
Список имеет тип List A = A * List A | EmptyList.

Список это элемент типа A и ещё точно также список, либо пустой список.
Другими словами, списки гомогенны (содержат элементы одинакового типа данных).

Если же у нас списки гетерогенные - начинается веселуха.

В терминах ООП у нас вводится базовый класс Base и два наследника - A и B
И мы получается список Base'ов... А не список A, B.

В терминах ФЯП это описывается как:
Base = A | B
List Base = Base * List Base | EmptyList;

Теперь приходим к понимаю, что для списка длиной два есть четыре варианта:
A, A
A, B
B, A
B, B

Ну и как это говно типизировать?
Вот и появлются tuple.

Tuple 'a 'b = a' * 'b;
get (a,b) i = match i with
0 -> a
1 -> b
end;

Какой тип результата get?
Естественно, a | b

Теперь проблема понятна?

(no subject)

Date: 2010-08-20 10:02 am (UTC)
From: [identity profile] metaclass.livejournal.com
Так ты представь, что у тебя не два поля, а двадцать. И что типы полей могут быть любые. И получаем комбинаторный взрыв из типов функций.

(no subject)

Date: 2010-08-20 10:47 am (UTC)
From: [identity profile] zamotivator.livejournal.com
Вот именно, о чём и речь

(no subject)

Date: 2010-08-21 01:28 am (UTC)
From: [identity profile] 109.livejournal.com
> Если же у нас списки гетерогенные - начинается веселуха

в F# нет гетерогенных списков.

> Теперь проблема понятна?

она и до того была понятна - в F# нет языковой поддержки для довольно тривиальной вещи, которая мне нужна.

(no subject)

Date: 2010-08-21 06:55 am (UTC)
From: [identity profile] zamotivator.livejournal.com
она и до того была понятна - в F# нет языковой поддержки для довольно тривиальной вещи, которая мне нужна.
Её нигде нет. Кроме, разве что, Haskell

(no subject)

Date: 2010-08-21 07:06 am (UTC)
From: [identity profile] metaclass.livejournal.com
В хаскеле в приемлемом для мозга виде тоже нет :)

(no subject)

Date: 2010-08-21 07:11 am (UTC)
From: [identity profile] zamotivator.livejournal.com
И ну его нахуй, если честно

Profile

109: (Default)
109

March 2019

S M T W T F S
     12
3456789
101112131415 16
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags