[F#] Вопрос по синтаксису
От: Пельмешко Россия blog
Дата: 19.06.09 05:55
Оценка:
let rec dig l x = if (x = 0) then l else dig (x%10 :: l) (x/10)
let rec gen l n = if (n = 0) then l else gen (dig l n) (n-1)

Можно ли как-нибудь покороче записать подобные конструкции? Многословно как-то, if бесит...
Наверняка на Хаскеле раза в два короче можно, но меня интересует ситуация в окамле...
Re: [F#] Вопрос по синтаксису
От: Аноним  
Дата: 19.06.09 07:18
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>но меня интересует ситуация в окамле...


Так F# или OCaml? На F# можно еще так записать:
let rec dig l = function
    |0 -> l
    |x -> dig (x%10 :: l) (x/10)

let rec gen l = function
    |0 -> l
    |n -> gen (dig l n) (n-1)
Re: [F#] Вопрос по синтаксису
От: deniok Россия  
Дата: 19.06.09 07:28
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>
П>let rec dig l x = if (x = 0) then l else dig (x%10 :: l) (x/10)
П>let rec gen l n = if (n = 0) then l else gen (dig l n) (n-1)
П>

П>Можно ли как-нибудь покороче записать подобные конструкции? Многословно как-то, if бесит...

Зачем gen такой сложный, проверка на ноль уже же есть в dig?

П>Наверняка на Хаскеле раза в два короче можно, но меня интересует ситуация в окамле...


Ну так там (в F#) вроде есть сопоставление с образцом (pattern matching). Это будет не короче, а читабельнее; я F# не очень знаю, поэтому на Хаскелле
gen = dig []

dig l 0 = l 
dig l x = dig (x `mod` 10 : l) (x `div` 10)
Re[2]: [F#] Вопрос по синтаксису
От: deniok Россия  
Дата: 19.06.09 09:05
Оценка:
Здравствуйте, deniok, Вы писали:

D>Зачем gen такой сложный, проверка на ноль уже же есть в dig?


Насчет gen прошу прощения, спросонья решил, что он должен делать что-то другое по сравнению с тем, что он делает. (Кстати, что он должен делать до сих пор не понимаю )
Re[3]: [F#] Вопрос по синтаксису
От: Пельмешко Россия blog
Дата: 19.06.09 15:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Так F# или OCaml? На F# можно еще так записать:

А>
А>let rec dig l = function
А>    |0 -> l
А>    |x -> dig (x%10 :: l) (x/10)

А>let rec gen l = function
А>    |0 -> l
А>    |n -> gen (dig l n) (n-1)
А>

F#, я видимо недооценил различие
Спасибо, находил этот вариант, просто хотелось как-нить короче в одну строку...

Здравствуйте, deniok, Вы писали:
D>(Кстати, что он должен делать до сих пор не понимаю )

Понимаю, бредово выглядит

Я просто вдохновленный этим топиком
Автор: Димчанский
Дата: 03.06.09
стал те же задачки решать на F#, по заданию надо сгенерировать иррациональную дробь вида:

0.123456789101112131415161718192021...

Re[4]: [F#] Вопрос по синтаксису
От: yuriylsh  
Дата: 19.06.09 16:39
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, Аноним, Вы писали:


А>>Так F# или OCaml? На F# можно еще так записать:

А>>
А>>let rec dig l = function
А>>    |0 -> l
А>>    |x -> dig (x%10 :: l) (x/10)

А>>let rec gen l = function
А>>    |0 -> l
А>>    |n -> gen (dig l n) (n-1)
А>>

П>F#, я видимо недооценил различие
П>Спасибо, находил этот вариант, просто хотелось как-нить короче в одну строку...

Можно еще так:

let rec dig l x = match x with 0 -> l | n -> dig (n%10 :: l) (n/10)
Luck in life always exists in the form of an abstract class that cannot be instantiated directly and needs to be inherited by hard work and dedication.
Re[4]: [F#] Вопрос по синтаксису
От: samius Япония http://sams-tricks.blogspot.com
Дата: 19.06.09 16:42
Оценка: 5 (1)
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, Аноним, Вы писали:


А>>Так F# или OCaml? На F# можно еще так записать:

А>>
А>>let rec dig l = function
А>>    |0 -> l
А>>    |x -> dig (x%10 :: l) (x/10)

А>>let rec gen l = function
А>>    |0 -> l
А>>    |n -> gen (dig l n) (n-1)
А>>

П>F#, я видимо недооценил различие
П>Спасибо, находил этот вариант, просто хотелось как-нить короче в одну строку...

можно и в одну
let rec dig l = function 0 -> l | x -> dig (x%10 :: l) (x/10)
Re[4]: [F#] Вопрос по синтаксису
От: FR  
Дата: 20.06.09 03:51
Оценка:
Здравствуйте, Пельмешко, Вы писали:


П>F#, я видимо недооценил различие


Различия конечно просто гигантские

let rec dig l = function
    |0 -> l
    |x -> dig (x mod 10 :: l) (x/10);;

let rec gen l = function
    |0 -> l
    |n -> gen (dig l n) (n-1);;




П>Спасибо, находил этот вариант, просто хотелось как-нить короче в одну строку...


Тогда тебе нужн изучать J и K или на худой конец APL
Re[5]: [F#] Вопрос по синтаксису
От: Аноним  
Дата: 20.06.09 09:48
Оценка:
Здравствуйте, FR, Пельмешко, Вы писали:

П>>Спасибо, находил этот вариант, просто хотелось как-нить короче в одну строку...

FR>Тогда тебе нужн изучать J и K или на худой конец APL

Ну (простите, Пельмешко) на хаскеле тоже можно в одну строку:
gen n = [digitToInt d | n <- [1..n], d <- show n]

Не менее понятно, впрочем, выходит и на J:
gen =: "."0 ,&":/ @ i.
Re[6]: [F#] Вопрос по синтаксису
От: FR  
Дата: 20.06.09 10:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, FR, Пельмешко, Вы писали:


П>>>Спасибо, находил этот вариант, просто хотелось как-нить короче в одну строку...

FR>>Тогда тебе нужн изучать J и K или на худой конец APL

А>Ну (простите, Пельмешко) на хаскеле тоже можно в одну строку:


Так чуть выше и на F# в одну строку, ну и list comprehension доступен как в Ocaml (camlp4 из коробки и стороние расширения, например Batteries Included) так и F# правда только для генераторов
Re[7]: [F#] Вопрос по синтаксису
От: Аноним  
Дата: 20.06.09 11:06
Оценка:
Здравствуйте, FR, Вы писали:

FR>Так чуть выше и на F# в одну строку, ну и list comprehension доступен как в Ocaml


Там только половина решения в одну строку вытянуто. Ну и раз доступен, почему бы здесь не привести для сравнения?
Re[8]: [F#] Вопрос по синтаксису
От: FR  
Дата: 20.06.09 12:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Там только половина решения в одну строку вытянуто. Ну и раз доступен, почему бы здесь не привести для сравнения?


Так я list comprehension в OCaml не использую, но если цель написать функцию целиком в одну строку то пожалуйста:

let rec gen s = function 0 -> s | n -> gen (explode (of_int n) @ s) (n - 1);;
Re[8]: [F#] Вопрос по синтаксису
От: FR  
Дата: 20.06.09 13:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Там только половина решения в одну строку вытянуто. Ну и раз доступен, почему бы здесь не привести для сравнения?


еще вариантик:
let gen n = explode (concat "" (List.init (n + 1) of_int));;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.