начал изучать 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 параметров должно быть достаточно для любого метода.
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 12:14 pm (UTC)В хаскеле можно так
{-# LANGUAGE GADTs, TypeFamilies, EmptyDataDecls #-} data Nil data O data S a data LT a b where LTO :: LT O (S n) LTS :: LT a b -> LT (S a) (S b) l0 = LTO l1 = LTS l0 l2 = LTS l1 data Row n a where Nil :: Row O Nil Cons :: a -> Row n b -> Row (S n) (a, b) type family Nth n a type instance Nth O (a, b) = a type instance Nth (S n) (a, b) = Nth n b rowNth :: LT n sn -> Row sn a -> Nth n a rowNth LTO (Cons a _) = a rowNth (LTS l) (Cons _ b) = rowNth l b row = Cons "Hello" $ Cons 123 $ Cons [] Nil nth n = rowNth n row test = do putStrLn $ nth l0 ++ ", world!" putStrLn $ "123 - 23 = " ++ show (nth l1 - 23) putStrLn $ "length [] = " ++ show (length $ nth l2)Но проще уж обычными записями.
А если параметры rowNth будут генериться в рантайме, то еще и придется доказывать хаскеллу, что i меньше длины строки, и дополнительно таскать описания типов. Конечно, в итоге будет меньше глюков, т.к. проверки приходится писать не после упавших тестов, а до запуска. Но это трудоемко.
Для БД, таблицы которой и так известны, лучше сгенерить отображалку в записи, или вообще getFieldByName )
(no subject)
Date: 2010-08-20 12:16 pm (UTC)Хде? Он определяется по контексту.
(no subject)
Date: 2010-08-20 07:21 pm (UTC)А по контексту можно написать что угодно. Если бы этот код работал, то можно было бы написать
get 0 ("String", ()) :: Int
или даже
get 12345 (1, 2)
(no subject)
Date: 2010-08-20 07:30 pm (UTC)(no subject)
Date: 2010-08-20 07:31 pm (UTC)(no subject)
Date: 2010-08-20 08:08 pm (UTC)Чето только на заголовки instance-ов посмотрел, и не обратил внимания на то, что результат Either.