[Ocaml || F#] Pattern Matching для двух и более переменных?
От: dotneter  
Дата: 21.05.07 20:48
Оценка:
Например из двух списков получить один с кортежами?
Что нибудь типа

let rec tList = function
    | x :: xs y :: ys -> (x,y) :: tList xs ys
    | [] _ -> []
    | _ [] -> []


И еще.

Все ок.
let rec qsort list = 
  match list with
    | f::rest -> 
        (qsort (List.filter ( fun n -> n <= f ) rest)) @ [f] @
        (qsort (List.filter ( fun n -> n > f ) rest))
    | [] -> []



Error 1 This expression has type 'a list -> 'b list but is here used with type 'b list
let rec qsort list = function
    | f::rest -> 
        (qsort (List.filter ( fun n -> n <= f ) rest)) @ [f] @
        (qsort (List.filter ( fun n -> n > f ) rest))
    | [] -> []

Не совсем понятно, чего его не устраивает.
Talk is cheap. Show me the code.
Re: [Ocaml || F#] Pattern Matching для двух и более переменн
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.05.07 22:04
Оценка:
Здравствуйте, dotneter, Вы писали:

D>Например из двух списков получить один с кортежами?

D>Что нибудь типа

D>
D>let rec tList = function
D>    | x :: xs y :: ys -> (x,y) :: tList xs ys
D>    | [] _ -> []
D>    | _ [] -> []
D>


Не специалист в ОКамле, но прицип в общем-то везде один — засунуть оба списка в кортеж. Так что думаю, что код будет примерно таким:
let rec tList (xs, ys) =
    match (xs, ys) with
        | (x :: xs, y :: ys) -> (x, y) :: tList (xs, ys)
        | ([], []) -> []
        | (_, _) -> throw new System.Exception ("...")

do System.Console.WriteLine(tList ([1, 2, 3, 4], ["-1-", "-2-", "-3-", "-4-"]))

(незнаю только как в F# исключения генерируются)
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Ocaml || F#] Pattern Matching для двух и более переменн
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 22.05.07 03:36
Оценка:
dotneter,

D>Например из двух списков получить один с кортежами?

D>Что нибудь типа

zip?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[2]: [Ocaml || F#] Pattern Matching для двух и более перем
От: dotneter  
Дата: 22.05.07 04:13
Оценка:
Здравствуйте, VladD2, Вы писали:

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


D>>Например из двух списков получить один с кортежами?

D>>Что нибудь типа

D>>
D>>let rec tList = function
D>>    | x :: xs y :: ys -> (x,y) :: tList xs ys
D>>    | [] _ -> []
D>>    | _ [] -> []
D>>


VD>Не специалист в ОКамле, но прицип в общем-то везде один — засунуть оба списка в кортеж. Так что думаю, что код будет примерно таким:

VD>
VD>let rec tList (xs, ys) =
VD>    match (xs, ys) with
VD>        | (x :: xs, y :: ys) -> (x, y) :: tList (xs, ys)
VD>        | ([], []) -> []
VD>        | (_, _) -> throw new System.Exception ("...")

VD>do System.Console.WriteLine(tList ([1, 2, 3, 4], ["-1-", "-2-", "-3-", "-4-"]))
VD>

VD>(незнаю только как в F# исключения генерируются)

Лишние скобки не очень хочется писать, плюс моя функция 'a list -> 'b list -> ('a * 'b) list
а ваша 'a list * 'b list -> ('a * 'b) list
Talk is cheap. Show me the code.
Re[2]: [Ocaml || F#] Pattern Matching для двух и более перем
От: dotneter  
Дата: 22.05.07 04:28
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>dotneter,


D>>Например из двух списков получить один с кортежами?

D>>Что нибудь типа

LCR>zip?


Оно. Оказывается так.

let rec zip lst1 lst2 = match lst1,lst2 with
  | [],_ -> []
  | _, []-> []
  | (x::xs),(y::ys) -> (x,y) :: (zip xs ys);;


Жаль только что нельзя такое упрощать до,

let rec zip = function
  | [],_ -> []
  | _, []-> []
  | (x::xs),(y::ys) -> (x,y) :: (zip xs ys);;


вроде бы все для вывода имеется.
Talk is cheap. Show me the code.
Re[3]: [Ocaml || F#] Pattern Matching для двух и более перем
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.05.07 22:53
Оценка:
Здравствуйте, dotneter, Вы писали:

D>Лишние скобки не очень хочется писать, плюс моя функция 'a list -> 'b list -> ('a * 'b) list

D>а ваша 'a list * 'b list -> ('a * 'b) list

Да, есть такое дело. Но это уже тараканы ОКамла .
На Немерле все это прокатывает на ура и без проблем:
public tList['a, 'b] (x : list ['a], y : list ['b]) : list ['a * 'b]
{
    | ([], []) => []
    | (x :: xs, y :: ys) => (x, y) :: tList(xs, ys)
    | _ => throw System.ArgumentException ("tList")
}
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [Ocaml || F#] Pattern Matching для двух и более перем
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.05.07 23:54
Оценка:
Здравствуйте, dotneter, Вы писали:

Кстати, как правльно в F# генерировать исключения? Что-то 20 минут доки рыл, так и не нашел .
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Ocaml || F#] Pattern Matching для двух и более перем
От: ie Россия http://ziez.blogspot.com/
Дата: 23.05.07 04:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Кстати, как правльно в F# генерировать исключения? Что-то 20 минут доки рыл, так и не нашел .


Для этого там есть функция raise:
val raise : #Exception -> 'b

raise (new Exception("Ooops! Exception!"))


Так же есть функции для генерации исключений определенных типов:
val failwith    : string -> 'a  // генерит FailureException
val invalid_arg : string -> 'a  // генерит InvalidArgumentException
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[4]: [Ocaml || F#] Pattern Matching для двух и более перем
От: dotneter  
Дата: 23.05.07 09:51
Оценка:
Здравствуйте, VladD2, Вы писали:

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


D>>Лишние скобки не очень хочется писать, плюс моя функция 'a list -> 'b list -> ('a * 'b) list

D>>а ваша 'a list * 'b list -> ('a * 'b) list

VD>Да, есть такое дело. Но это уже тараканы ОКамла .

VD>На Немерле все это прокатывает на ура и без проблем:
VD>
VD>public tList['a, 'b] (x : list ['a], y : list ['b]) : list ['a * 'b]
VD>{
VD>    | ([], []) => []
VD>    | (x :: xs, y :: ys) => (x, y) :: tList(xs, ys)
VD>    | _ => throw System.ArgumentException ("tList")
VD>}
VD>

А чего так много буковок то? Какой же в этом плане Haskell пипатый. =)

tList [] _ = []
tList _ [] = []
tList (x : xs) (y : ys) = (x,y) : tList xs ys
Talk is cheap. Show me the code.
Re[5]: [Ocaml || F#] Pattern Matching для двух и более перем
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 23.05.07 10:28
Оценка: :)
Здравствуйте, dotneter, Вы писали:

D>А чего так много буковок то? Какой же в этом плане Haskell пипатый. =)


D>
D>tList [] _ = []
D>tList _ [] = []
D>tList (x : xs) (y : ys) = (x,y) : tList xs ys
D>


Зато в Haskell tList надо повторять при каждом наборе образцов. Лучше так

tList = zip


Так ещё короче
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: [Ocaml || F#] Pattern Matching для двух и более перем
От: ie Россия http://ziez.blogspot.com/
Дата: 23.05.07 11:06
Оценка: :)
Здравствуйте, dotneter, Вы писали:

D>А чего так много буковок то? Какой же в этом плане Haskell пипатый. =)


D>
D>tList [] _ = []
D>tList _ [] = []
D>tList (x : xs) (y : ys) = (x,y) : tList xs ys
D>


Влад привел пример с методом, с локальной функцией покороче:
def tList (x, y)
{
    | (_, []) => []
    | ([], _) => []
    | (x :: xs, y :: ys) => (x, y) :: tList(xs, ys)
}


Хотя я тут, конечно, маленько лукавлю. Дело в том, что тип функции выведется при первом его применении и к спискам других типов эту функцию применить будет нельзя.
Тем не менее нельзя не признать, краткость Хаскеля на высоте, но до J далековато
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[6]: [Ocaml || F#] Pattern Matching для двух и более перем
От: dotneter  
Дата: 23.05.07 11:17
Оценка:
ie>, но до J далековато
Пример в студию.
Talk is cheap. Show me the code.
Re[7]: [Ocaml || F#] Pattern Matching для двух и более перем
От: ie Россия http://ziez.blogspot.com/
Дата: 23.05.07 11:23
Оценка:
Здравствуйте, dotneter, Вы писали:

ie>>, но до J далековато

D>Пример в студию.

zip =. ,.

... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[8]: [Ocaml || F#] Pattern Matching для двух и более перем
От: dotneter  
Дата: 23.05.07 11:28
Оценка:
Здравствуйте, ie, Вы писали:

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


ie>>>, но до J далековато

D>>Пример в студию.

ie>
zip =. ,.

ie>

Круто, но как я понял это не язык общего назначения, так что не считается.
Talk is cheap. Show me the code.
Re[8]: [Ocaml || F#] Pattern Matching для двух и более перем
От: Mirrorer  
Дата: 23.05.07 11:33
Оценка:
Здравствуйте, ie, Вы писали:

ie>
zip =. ,.


Почему-то мне кажется что результат выполнения
 1 2 3 ,. 4 5

будет отличаться от

 zip [1, 2 ,3] [ 5, 6]


... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[9]: [Ocaml || F#] Pattern Matching для двух и более перем
От: ie Россия http://ziez.blogspot.com/
Дата: 23.05.07 11:47
Оценка:
Здравствуйте, Mirrorer, Вы писали:

M>Почему-то мне кажется что результат выполнения

M>
 1 2 3 ,. 4 5

M>будет отличаться от

M>
M> zip [1, 2 ,3] [ 5, 6]
M>


M>)


А это как zip написать
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[10]: [Ocaml || F#] Pattern Matching для двух и более пере
От: Mirrorer  
Дата: 23.05.07 11:52
Оценка:
Здравствуйте, ie, Вы писали:

ie>А это как zip написать


Ну имелся ввиду Prelude-овский

Но в общем ты конечно прав
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[10]: [Ocaml || F#] Pattern Matching для двух и более пере
От: Mirrorer  
Дата: 23.05.07 12:17
Оценка:
Здравствуйте, ie, Вы писали:

ie>А это как zip написать


Ага. Допустим так
a =. 1 2 3
b =. 4 5
((i.((# a) <. (#b))) { a) ,. ((i.((# a) <. (#b))) { b)


Интересно, еще более длинно можно ?
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[5]: [Ocaml || F#] Pattern Matching для двух и более перем
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.05.07 12:41
Оценка:
Здравствуйте, dotneter, Вы писали:

D>А чего так много буковок то?


Забавный перевод темы.

Дык типы описываются. Плюс еще доступна перегрузка. Ты можешь объявить хоть десять функций tList в одной области видимости (перегруженные по параметрам).

D> Какой же в этом плане Haskell пипатый. =)


Опиши в нем типы и будет тоже самое. Или используй в немерле локальные функции для которых вывод типов работает.

D>
D>tList [] _ = []
D>tList _ [] = []
D>tList (x : xs) (y : ys) = (x,y) : tList xs ys
D>


Забавно, что это другой алгоритм. В исходном исключение в случае несовпадения списков.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Ocaml || F#] Pattern Matching для двух и более перем
От: deniok Россия  
Дата: 23.05.07 13:07
Оценка:
Здравствуйте, VladD2, Вы писали:

D>>
D>>tList [] _ = []
D>>tList _ [] = []
D>>tList (x : xs) (y : ys) = (x,y) : tList xs ys
D>>


VD>Забавно, что это другой алгоритм. В исходном исключение в случае несовпадения списков.


исходный пост
Автор: dotneter
Дата: 22.05.07
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.