кана
уже было, ладно
кана
меня можно игнорировать
Aleksei (astynax)
Ну да, аккумулятор вторым аргументом. Это я тупанул :)
Aleksei (astynax)
Вижу a -> x -> x, и в голове "x - элемент, a - accumulator", а на результат не посмотрел
Кабачок
Тупая задачка: как сгенерировать число из неповторяющихся цифр?
Алексей
Сгенерировать перестановку и взять первые N цифр?
Кабачок
Наверно хаскеллистов специально учат такие задачи решать.
Кабачок
Или она слишком тупая.
Кабачок
Евгений
кана
а там было чет про рандом?
Anonymous
read "1234567890" :: Int
Кабачок
Не было, но подразумевалось. У тебя все равно с цифрами проблемы.
Anonymous
возьми калькулятор числа пи
Aleksei (astynax)
там есть повторяющиеся цифры :)
Aleksei (astynax)
перемешать [0..9] и взять любой длины слайс?
кана
подразумевается, что больше 9 никто не введет)
кана
Aleksei (astynax)
Откуда?
Anonymous
не будет
Aleksei (astynax)
"перемешать" же
кана
Кабачок
Кабачок
Попахивает джавой)
Aleksei (astynax)
кана
а, стоп, точно
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
в питоне есть готовая функция для выборки неповторящихся значений. Но она может быть реализована через шаффл+слайс
Ilya
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?
Dmitrii
mconcat $ map show можно чуть короче написать как foldMap show
Alexander
все окончательно записался в fpconf
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
там уже достаточно толстая иерархия, не хочется ещё один аргумент добавлять к уже и так не малому списку
Anonymous
можно же тип X сделать ассоциированным
Kirill
?
Alexander
вот это вот^
A64m
не понял про отделение реализации от интерфейса
Alexander
class Foo a where
data X a :: *
...
Alexander
я тоже не понял, если честно
Alexander
но associated type with class вроде делают, то что надо
Alexander
type вместо data если неинъективно надо
Kirill
да это просто задел на возможность простого расширения без изменения тайпклассов
Kirill