@Fsharp_chat

Страница 708 из 772
Evgeniy
14.09.2018
06:30:32
Привет.

Валентин
14.09.2018
06:30:53
Приветствую!

Я надеюсь, что меня тут тряпками не закидают за глупый вопрос. Только начинаю изучать язык. Почему это код возвращает функцию, а не результат функции? let m = 12345 let digits n = tostr m >> Seq.toList >> List.map (fun u -> int u - int '0') >> List.item n let result = digits 2 printfn "%A" result

Google
Fill
14.09.2018
06:51:06
Из-за оператора композиции ">>"

Замени на "|>"

Валентин
14.09.2018
06:53:27
В таком случае на Seq.toList ругается: The type 'unit -> string' is not compatible with the type 'seq<'a>'

Fill
14.09.2018
06:54:30
tostr возвращает string?

Валентин
14.09.2018
06:57:55
Совершенно верно, проблема была в tostrе) Но я всё равно не могу понять как из композиции функций вернуть результат?

Fill
14.09.2018
06:58:39
Композиция возвращает новую функцию

По ее сигнатуре можно понять, какие параметры она принимает

И скормить их ей

Вот тебе и результат

Валентин
14.09.2018
06:59:37
int -> 'c -> int

Валентин
14.09.2018
07:33:52
Только let tostr n = m.ToString(), или даже let tostr _ = m.ToString() Но параметр m он получает из замыкания (как я подозреваю), но тем не менее digits всё равно требует второй параметр, причём не важно что туда передать, т.к. он игнорируется

Vasily
14.09.2018
07:34:16
Тут нет замыканий

Google
Vasily
14.09.2018
07:36:09
Ты лучше скажи, что хочешь получить на выходе

Валентин
14.09.2018
07:39:21
Ты лучше скажи, что хочешь получить на выходе
Стыдно признаваться, но таким образом я пытаюсь получить n-ую цифру из числа. Но это не самоцель, главное - развить функциональное мышление, понимание

Vasily
14.09.2018
07:50:57
Смотри, цепочка следующая : На входе у функции два параметра

Число и количество разрядов

Про то, в каком им порядке лучше идти, пока не будем обсуждать

Дальше

Число надо преобразовать в строку

Взять у нее второй символ

Точнее n-ный

И преобразовать в число

Обратно

число в строку преобразуется тривиально

string n

Такс, напишу-ка я gist

Artemy
14.09.2018
07:55:53
Да, аналог tostr уже в стандартной библиотеке есть — функция string

Vasily
14.09.2018
07:57:32
let digit n number= number |>string |>Seq.item n |> (fun c->int c-int '0')

Вот это минимально работает

Дальше уже куча нюансов

Типа проверки на длину этц

Friedrich
14.09.2018
08:40:17
Google
Валентин
14.09.2018
08:40:27
Спасибо! Я пытался провернуть это через композицию функций, пока не получилось

Vasily
14.09.2018
08:40:39
Artemy
14.09.2018
08:42:01
Стыдно признаваться, но таким образом я пытаюсь получить n-ую цифру из числа. Но это не самоцель, главное - развить функциональное мышление, понимание
Вообще, ничего стыдного. Это норма, что в начале работы с ФП решение даже тривиальных задач туго идёт

Vasily
14.09.2018
08:43:55
@fvnever Затих шота

Friedrich
14.09.2018
08:44:12
@fvnever Затих шота
Вы мусорите в куче!

Я просто задыхался от гнева :)

Vasily
14.09.2018
08:44:24
А, ты про аллокации

Friedrich
14.09.2018
08:44:32
Ну, это же можно математикой решить

Vasily
14.09.2018
08:44:38
Ну на пайпах можно

Artemy
14.09.2018
08:44:41
Спасибо! Я пытался провернуть это через композицию функций, пока не получилось
Наверное, лучше сначала написать решение с указанием всех параметров явно, а затем уже сократить и заменить |> на композицию

Vasily
14.09.2018
08:44:47
А можно и математикой

Friedrich
14.09.2018
08:44:53
Решается десятичным логарифмом и остатком от деления.

Vasily
14.09.2018
08:45:06
Угу

Friedrich
14.09.2018
08:45:18
Конечно, логарифм ещё хочется помикрооптимизировать, но это уже будет на порядки лучше, чем выделение стрингов в куче :)

Vasily
14.09.2018
08:45:22
Тоскуешь, видать, по моргу-то

Friedrich
14.09.2018
08:46:03
Тоскуешь, видать, по моргу-то
Я сегодня как раз вечером буду консультацию для морга устраивать.

Vasily
14.09.2018
08:46:47
В целом, я согласен с @fvnever , что задача решается неоптимальным образом

С т.з. выделения памяти

Google
Vasily
14.09.2018
08:47:14
Кстати

Roman
14.09.2018
08:47:18
let digit n number= number |>string |>Seq.item n |> (fun c->int c-int '0')
может так лучше? let digit number index = string number |> Seq.tryItem index

ну, это если без логарифмов

Vasily
14.09.2018
08:47:41
может так лучше? let digit number index = string number |> Seq.tryItem index
Ну я писал про минимально работающий пример

Roman
14.09.2018
08:47:43
хотя там еще надо на - проверить первый символ

Vasily
14.09.2018
08:47:50
Дальше, естественно, опшны и прочее

Vlad
14.09.2018
08:48:25
именно

Ayrat
14.09.2018
08:49:17
Решается десятичным логарифмом и остатком от деления.
тут речь идёт про обучение ФП, а не про оптимизации аллокаций)

Vasily
14.09.2018
08:49:23
Во-во

Artemy
14.09.2018
08:49:27
Валентин вот, например, здесь: let digit n number= number |>string |>Seq.item n |> (fun c->int c-int '0') чётко видно, что `number` можно с обеих сторон сократить. И в результате получить: let digit n = string >> Seq.item n >> fun c -> int c - int '0'

Friedrich
14.09.2018
08:49:30
Artemy
14.09.2018
08:50:37
Блин, я с форматированием запутался

Vasily
14.09.2018
08:51:12
К тому же, в твоей функции не будет явно задан тип аргумента

Скорее всего

А выведет по первому переданному

Artemy
14.09.2018
08:52:05
Да, тип уже обобщённый: 'a -> 'b -> 'c

Но Валентин же хотел именно композицией, потому и привёл соответствующий пример

Google
Vasily
14.09.2018
08:53:36
Я вот как-то композицию не очень люблю

Валентин
14.09.2018
08:53:49
Но Валентин же хотел именно композицией, потому и привёл соответствующий пример
Совершенно верно. Я пытался понять чем композиция от пайпинга отличается

Vasily
14.09.2018
08:54:09
Композиция - это склейка нескольких функций в одну

Пайпинг - передача результата одной функции на вход другой

Artemy
14.09.2018
08:54:30
Мне нравится в некоторых случаях. Например, для отрицания. (not << isDigit) x читается приятнее, чем x |> isDigit |> not

Vasily
14.09.2018
08:54:42
Тут согласен

Artemy
14.09.2018
08:55:32
Ну а во многих случаях, да, композиция может запутать

Всё-таки параметры опускаются и ты в коде их не видишь

Валентин
14.09.2018
08:57:16
Композиция - это склейка нескольких функций в одну
Но это ведь и означает, что мы одну функцию (а с бытовой точки зрения результат одной функции) передаём аргументом другой? Или я ошибаюсь?

Artemy
14.09.2018
08:58:08
У композиции оба аргумента — функции. У пайпа же один параметр — значение, а другой — функция

Валентин
14.09.2018
09:00:53
Чем sin(sqr(2)) отличается от sin(4)?

Artemy
14.09.2018
09:01:51
Структурой выражения

Но по результату не отличаются

Александр
14.09.2018
09:02:39
Решается десятичным логарифмом и остатком от деления.
если бы индекс задавался справа налево, то и никакого логарифма не нужно

Валентин
14.09.2018
09:03:31
Но по результату не отличаются
Вот это я и пытаюсь уложить себе в мозг)

Vasily
14.09.2018
09:06:33
Прими то, что переменных нет

Есть функции

И сразу станет проще

let num=5

Тоже функция

Страница 708 из 772