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:49 am (UTC)
From: [identity profile] zamotivator.livejournal.com
Рискну выказать предположение.
GetValue(i) нужен для одной единственной цели - построить итерацию по таплу для обработки.
По идее, тут достаточно показать человеку как использовать параметрические функции а также map/etc, и проблема уйдёт.

Это в дополнении к:
http://109.livejournal.com/539588.html?thread=2049476#t2049476

(no subject)

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

(no subject)

Date: 2010-08-20 10:48 am (UTC)
From: [identity profile] zamotivator.livejournal.com
Ну если у нас гетерогенный контейнер - список сумма - то why not?

(no subject)

Date: 2010-08-20 11:00 am (UTC)
From: [identity profile] metaclass.livejournal.com
эээ, ты что имеешь в виду?
Конвертировать тупл в гетерогенный список типа [SqlInt int;SqlString string], а тип тупла в [Type] и потом по ним итерироваться?
Но функцию конвертации в любом случае без компилятора не сделаешь. И вообще это в дотнете встроенное уже есть, reflection

Вот обратное - из типов и списков сгенерить тупл - уже без метапрограммирования не сделаешь.

(no subject)

Date: 2010-08-21 02:12 am (UTC)
From: [identity profile] 109.livejournal.com
> Конвертировать тупл в гетерогенный список типа [SqlInt int;SqlString string]

wait, так нет же гетерогенных списков.

(no subject)

Date: 2010-08-21 06:19 am (UTC)
From: [identity profile] metaclass.livejournal.com
type SqlType=
| SqlInt of int
| SqlString of string

let sqlItems = [SqlInt 1; SqlString "test" ]

Вот. Вполне себе гетерогенный список.

(no subject)

Date: 2010-08-21 02:09 am (UTC)
From: [identity profile] 109.livejournal.com
ну вот да, что-то типа этого. ну и хотелось бы языковую поддержку хотя бы для операций [type1; type2; ...] -> (type1 * type2 * ...) и GetValue(i)

а, ну и ещё - возможно, что это и так есть, просто я не знаю - хотелось бы иметь человеческое инстанцирование из type variable, типа:

class My1 {}
class My2 {}
Type t;
t = My1;
My1 my1 = t.New();// инстанцируем My1
t = My2;
My2 my2 = t.New();// инстанцируем My2

в дельфи было что-то близкое, но я забыл уже. понятно, что через Reflection в дотнете это можно, хочется straightforward syntax.

(no subject)

Date: 2010-08-21 06:18 am (UTC)
From: [identity profile] metaclass.livejournal.com
Да, да, в дельфи это именно так и было, и в .NET этого очень дико не хватает.

(no subject)

Date: 2010-08-21 01:52 am (UTC)
From: [identity profile] 109.livejournal.com
ну так покажите же уже наконец человеку, как итерировать по таплу, а то пока все пишут, что это невозможно.

параметрические функции - это функции с параметрами, да? (что такое параметрические функции в математике я знаю, а что вы тут имели в виду - нет)

(no subject)

Date: 2010-08-21 07:11 am (UTC)
From: [identity profile] zamotivator.livejournal.com
let mapTuple callback tuple = match tuple with
Tuple(a) -> (callback a);
Tuple(a,b) -> begin (callback a); (callback b); end;
Tuple(a,b,c) -> begin (callback a); (callback b); (callback c); end;
....

end;

mapTuple you_function your_tuple.

(no subject)

Date: 2010-08-21 07:40 am (UTC)
From: [identity profile] metaclass.livejournal.com
callback какой тип будет иметь?
Ну и вообще это закат солнца вручную.

(no subject)

Date: 2010-08-21 08:01 am (UTC)
From: [identity profile] zamotivator.livejournal.com
type tuple_1 'a = 'a
and tuple_2 'a 'b = 'a * 'b
and ...
and callback_argument = tuple_1 | tuple_2 | ....
and calback_result a 'b ... = 'a | 'b | 'c ...;
let callback : callback_argument -> callback_result

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