кана
уже было, ладно
кана
меня можно игнорировать
Aleksei (astynax)
Ну да, аккумулятор вторым аргументом. Это я тупанул :)
Aleksei (astynax)
Вижу a -> x -> x, и в голове "x - элемент, a - accumulator", а на результат не посмотрел
Кабачок
Тупая задачка: как сгенерировать число из неповторяющихся цифр?
Алексей
Сгенерировать перестановку и взять первые N цифр?
Кабачок
Наверно хаскеллистов специально учат такие задачи решать.
Кабачок
Или она слишком тупая.
Евгений
Тупая задачка: как сгенерировать число из неповторяющихся цифр?
Взять множество цифр S, N взять равным len(S) (основание системы счисления), взять произвольное L от 1 до N, потом пройтись от 1 до L, выбирая произвольный элемент из S и прибавить его к умноженной на N "заготовке"
Кабачок
кана
а там было чет про рандом?
Anonymous
read "1234567890" :: Int
Евгений
а там было чет про рандом?
Есди бы не было, то просто 1234567890
Кабачок
Не было, но подразумевалось. У тебя все равно с цифрами проблемы.
кана
Есди бы не было, то просто 1234567890
ну я так и сделал, просто позволил указать длину числа, так как понял именно это под "сгенерировать"
Anonymous
возьми калькулятор числа пи
Aleksei (astynax)
там есть повторяющиеся цифры :)
Aleksei (astynax)
перемешать [0..9] и взять любой длины слайс?
кана
подразумевается, что больше 9 никто не введет)
кана
Aleksei (astynax)
Откуда?
Anonymous
не будет
Aleksei (astynax)
"перемешать" же
кана
"перемешать" же
010 - тут нуль два раза
Кабачок
Попахивает джавой)
Aleksei (astynax)
010 - тут нуль два раза
В [0..9] нет повторов
кана
а, стоп, точно
Aleksei (astynax)
Перемешать == сделать сколько-то попарных перестановок :)
Aleksei (astynax)
На пейтоне это выглядело бы так: >>> l = list(range(10)) >>> random.shuffle(l) >>> l[:4] [1, 4, 0, 5] :) В хаскелепакетах наверняка есть shuffle для вектора или массива
Anonymous
Anonymous
лолл
Aleksei (astynax)
В данном случае это экономия на спичках :)
Aleksei (astynax)
Пока цифры - десятичные :)
Anonymous
как за nlogn
adam
хистопрепроморфизмом с проверкой имеющихся как естественное преобразование
Aleksei (astynax)
"проверка имеющихся", это n^2 не?
adam
я не об этом
adam
был бы не с телефона — попробовал
adam
хотя не, не думаю, что она под nlogn пойдёт
Aleksei (astynax)
Можно ещё "n раз выбирать из мешка с m неповторяющимися цифрами без складывания выбранных цифр назад"
Aleksei (astynax)
Тогда проверять имеющиеся будет не нужно
Aragaer
в питоне есть готовая функция для выборки неповторящихся значений. Но она может быть реализована через шаффл+слайс
Aragaer
random.sample(population, k) Return a k length list of unique elements chosen from the population sequence or set. Used for random sampling without replacement.
Oleg
чото я опоздал
Oleg
import qualified Data.Set as Set decodePerm::Integer->Integer decodePerm x = snd $ foldr go ((Set.fromList [0..9], x), 0) [10, 9..1] where go i ((digs, code), num) = let (code', fromInteger -> d) = code `divMod` i dig = Set.elemAt d digs digs' = Set.deleteAt d digs num' = num * 10 + dig in ((digs', code'), num')это за n log n?
кана
перемешать [0..9] и взять любой длины слайс?
а, вот, на выходе же список. Весь мой код - это по сути склеивание цифр в число
Dmitrii
mconcat $ map show можно чуть короче написать как foldMap show
Alexander
все окончательно записался в fpconf
Ilya
mconcat $ map show можно чуть короче написать как foldMap show
Какие-нибудь IDE для х-ля умеют такое подсказывать? 🤔
Alexander
есть шанс что hlint
Dmitrii
Какие-нибудь IDE для х-ля умеют такое подсказывать? 🤔
hlint может только для конкретного правила, то есть если в его конфиге есть правило: заменять mconcat $ map f на foldMap f, тогда может. И если IDE подсвечивает подсказки hlint, тогда и IDE может. Проверил сейчас на дефолтном конфиге: такого правила там нет.
Kirill
Можно в хаскеле объявить абстрактный тип и его реализацию в другом модуле? что-то типа такого: module A where data X class MyClass a where a :: X -> a —- module B where import A data X = X String instance MyClass String where a (X v) = v
A64m
можно, но это новая фича с ghc 8.2 и cabal 2, больше нигде работать не будет
Kirill
К стаку это прикрутить можно?
A64m
нет
Kirill
печаль(
A64m
хотя, если все это используется в одном пакете то может и можно
кана
использовать семейства тут нельзя?
A64m
а как предполагается это использовать-то?
Kirill
использовать семейства тут нельзя?
я пока не в курсе за семейства)
A64m
т.е. вот как эти модули потом используются?
Kirill
а как предполагается это использовать-то?
есть пара типов которые будут реализациями классов, и вот в этих классах нужен один из этих типов. хотелось бы отделить реализацию от интерфейса
Kirill
т.е. вот как эти модули потом используются?
импортится модуль с классами и модуль с типами
кана
для этого еще можно использловьб многоаргументные тайпклассы
Kirill
там уже достаточно толстая иерархия, не хочется ещё один аргумент добавлять к уже и так не малому списку
Anonymous
можно же тип X сделать ассоциированным
Kirill
?
Alexander
вот это вот^
A64m
не понял про отделение реализации от интерфейса
Alexander
class Foo a where data X a :: * ...
Alexander
я тоже не понял, если честно
Alexander
но associated type with class вроде делают, то что надо
Alexander
type вместо data если неинъективно надо
Kirill
да это просто задел на возможность простого расширения без изменения тайпклассов
Kirill