- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
splitOn :: (a -> Bool) -> [a] -> [[a]]
splitOn _ [] = []
splitOn f xs = removeEmpty $ takeWhile (not . f) xs: splitOn f (dropWhile (f) $ dropWhile (not . f) xs) where
removeEmpty [] = []
removeEmpty (x:xs)
| null x = removeEmpty xs
| otherwise = x: removeEmpty xs
words' :: String -> [String]
words' = splitOn (flip elem " \n\r\f\t\v\160")
(takeWhile (not . f) xs, dropWhile (not . f) xs) = break xs
Итого:http://ideone.com/C6z4N9
Я пишу сигнатуру до написания функции, т.к. это дает ряд преимуществ:
1. По сигнатуре можно приблизительно понять, что делает функция, следовательно, если написать сигнатуру, будет проще затем написать саму функцию.
2. Сигнатура четко говорит компилятору, что мне требуется именно такая функция и это не дает мне ошибиться.
3. Нельзя также упускать из виду проблему let-связанного полиморфизма. Случается она конечно редко, но все-же.
В итоге идеальным решением будет написать сигнатуру перед написанием функции, а затем по-желанию убрать.
например?
?
И как тут поможет сигнатура функци? Имхо сам как-бы глупость написал.
Например для кода
Компилятор выведет тип:
Но он слишком частный. Почему он не вывел:
А все это ограничение.
В ghc есть специальный ключ, убирающий это ограничение - XNoMonomorphismRestriction, но это не по стандарту, так-что лучше просто записать сигнатуру.
Единственное - можно от него избавиться либо указав компилятору "ты дурак, вот он правильный тип" либо сказав "ты молодец, только вот XNoMonomorphismRestriction".
Да выведет правильный тип.
А какой плюс в этом? Помоему больше минусов, чем плюсов.
Никаких плюсов, это ограничение ввелось само-собой случайно, не по воле авторов стандарта или трансляторов.
Я вообще надеюсь, что в следующем стандарте или в следующей версии ghc это ограничение будет снято по-умолчанию.
http://ideone.com/DT7x1V
http://ideone.com/aZ3Flk
Но если указать сигнатуру, или NoMonomorphismRestriction , то все нормально:
http://ideone.com/OIh4L7
http://ideone.com/M9mKx6
"eq = (==)"
Офигеешь.
А вот ad::(Num a) => a -> a -> a как-то не кузяво.
eq :: Eq a => a -> a -> Bool
P.S. А вообще да, поднимать надо до Rational.
Зачем? Обощённого варианта ad::(Num a) => a -> a -> a должно хватить на всех. До него надо поднимать, имхо.
Переменные в моём чистом хацкеле! No Way!
Работают намного быстрее списка из чаров\байтов. Ну и набор сверток, мапов и прочего к ним есть, который оптимизнут, и умеет в fusion.
P.S. Есть ленивый ByteString и строгий ByteString.
P.P.S. И без перегрузки строковых литералов нужно писать ByteString.pack "хуй", а с перегрузкой просто "хуй", и он сам сделает все что нужно.
Это же тоже самое что:
[ a | a <- zip xs ys ]
> а затем по-желанию убрать.
Регулярно так делал (вне хаскеля конечно). Много раз об этом жалел, если приходилось править безсигнатурные функции, тк чтобы разобраться - приходилось возвращать сигнатуры обратно. Но это так сказать нарушало красоту кода и я их убирал обратно, потом снова возвращал и снова убирал и так несколько раз.
Тут дело привычки. Мне больше нравится если есть сигнатура.
Обычно сигнатуры и имени функции достаточно, чтобы полностью понять, что она делает.
Не пытайтесь код на Хацкиле писать!
В Хацкиле кортежи, в Хацкиле монады,
А еще там жесткие, злые лямбды.
Вам будут мозги рвать и убивать,
Не пытайтесь, дети на хацкиле писать.
Хацкил он статичный, Хацкил он урод
В Хацкиле ужасный типа "чистый" код.
Его форсят злодеи чтоб извращать детей -
Ленивый, нехороший - трогать его не смей!
И папочка и мамочка на говнокодике сидят,
И папочка и мамочка деткам говорят:
"Хацкил ужасен, да-да-да!
Хацкил опасен, да-да-да!
Хацкил ужасен, да-да-да!
Хацкил опасен, да-да-да!
Не учите Хацкиля, не пишите в Хацкиле,
Не учите Хацкиля, не пишите в Хацкиле,
Не учите Хацкиля, дети, никогда!"
А Гумно и fai - GHC уже читают,
Хацкилем всех донимают,
Паттерн-матчинг постигают,
Ну и Хацкиль!
Вот так Хацкиль!
Типы нам не надо кодить
- он и сам их повыводит
Ну и Хацкиль!
Вот так Хацкиль!
Генератор списков оседлали
ProjectEuler погоняли
Ну и Хацкиль!
Вот так Хацкиль!
"Вон побочные эффекты
Распахнули злую пасть.
Сможете, вы, детки
на грабли не наступать?"
"Нам побочные эффекты
Нипочём, нипочём,
Мы побочные эффекты
Монаднём, Монаднём"
Нет. Ведь это код
На говнокод, по-моему, можно постить вообще всё что угодно.
Я понятный,
Я простой и я функциональный!
И мне не надо
Ни паттернизма,
Ни оопизма,
Я только хочу маленьких
(Да, очень маленьких!)
маленьких, коротеньких функций побыстрей!"
Он простотой своей прельщает,
Он параллелит каждый бит,
Он мусор сам весь собирает,
И слово страшное кричит:
"Крестоблядь, крестоблядь
Перестань говно писать"
А Гумно и fai смеются,
Не нарадуются:
"Ну и Хацкиль,
Что за Хацкиль -
Замечательный!"
"Крестоблядь, крестоблядь
Перестань говно писать"
"Посмотри-ка побыстрей
Кто с на помощь к нам пришел!
Ужас всех крестоблядей
Добрый кодер ТарасБ!"
Убежал он на геймдев и ревёт,
И Пушкова, и Пушкова
Обратным вызовом зовёт.
"Выходи-ка, поскорей!
Этих гадких детей
Корми калом побыстрей
И говна ты не жалей!"
Гумно с фаем задрожали -
Как Пушкова увидали.
Начали они бежать
Но Пушкову их догнать
Не составило трудов
Хацкиль ведь не может
Убегать быстрей крестов
И многопоточность тоже...
Но тут Гумно увидел:
"Посмотри-ка побыстрей
Кто с на помощь к нам пришел!
Ужас всех крестоблядей
Добрый кодер ТарасБ!"
Добрый кодер ТарасБ
К Гумну с faiем подбегает,
И крестозлодею,
Улыбаясь, говорит:
"Крестосударь, ну-ка
Развяжите, отпустите
Этих маленьких детей!
И давайте побыстрей!"
Но Пушков Тараса хватает
В крестобан его бросает.
Гумно плачет и рыдает,
Пушкова он умоляет:
"Пушков смилуйся над нами,
Отпусти нас поскорей
К нашей милой маме!
Похлебать её борщей
От неё мы убегать
Никогда больше не будем
А об императивном коде
Мы тоже не забудем!"
"Пристрелю вас как собак"
А Гумно плачет: "Не надо
Я у мамочки дурак"
"Ну уж нет!!!"
Рявкнул Пушков, но ненароком,
Взяв крестовый пистолет,
Выстрелил себе он в ногу!
А в Гумна не смог попасть!
fai с Гумном на Хацкиль сели
Снова бросились бежать
И кричат "Скорее, ходу"
Так как Хацкиль туповат.
Ну а вот по говнокоду
Ровным строем пхпешники идут
Песню звонкую поют
(Вроде рифма, вроде складно
А послушать - копипаста)
Гумно с файем услыхали
И на помощь их зовут.
Те запыхавшись подбегают
И ответ им свой дают
"Маму с папой не слушались
А над нами насмехались
Что наши предки обезьяны
И мы кодим за бананы"
но, блин, не люблю неоконченные дела.
Потом Пушкофу надоело за ними гоняться, он подобрел и они всё вместе ушли с говнокода раковать на геймдев. Где и умерли от рака жопы.
И жили долго и счастливо, и умерли атомарно.
и опустили