- 1
- 2
- 3
- 4
- 5
data Trivalent = TriFalse | TriUnknown | TriTrue deriving (Show, Eq, Ord)
(&) :: Trivalent -> Trivalent -> Trivalent -- &&
(!) :: Trivalent -> Trivalent -> Trivalent -- ||
nt :: Trivalent -> Trivalent -- not
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+124
data Trivalent = TriFalse | TriUnknown | TriTrue deriving (Show, Eq, Ord)
(&) :: Trivalent -> Trivalent -> Trivalent -- &&
(!) :: Trivalent -> Trivalent -> Trivalent -- ||
nt :: Trivalent -> Trivalent -- not
В хасскеле нет класса для логических значений. А значит хрен переопределишь операторы &&, || и функцию not
> Хрен переопределишь:
http://ideone.com/nG59NT
x || y = max x y
x && y = min x y
Ну а not проще никак не сделать.
А то, что я правильно написал - класса Logical c операторами && || not - нет! Num - есть, Fractional - есть, Integral - есть, Eq, Show, Read, Ord и т.д. и т.п - всё есть.
А класса для реализации произвольной логики - нет! Есть всего-лишь недотип data Bool...
http://ideone.com/rXQ0lw
Мне остаётся только восхищаться.
Какое у тебя самомнение. Лучше вообще не пиши говно, ок?
Не. Это мнение о типизации слишком низкое. Рядом есть много более перспективных типизаций, а майкрософт выбрала самую простую и кривую.
Помнится, кто-то катил бочку на Хиндли-Милнера
> Хиндли-Милнер - детский сад и в Немерле не применяется
http://govnokod.ru/11658#comment152370
1) В Хаскеле вроде модификация Хиндли-Милнера, в отличие от F#, где он более чистый.
2) Я сказал, что эта типизация подходит Хаскелю. Типизация ~= система типов + система вывода типов.
Так вот в Хаскеле система вывода типов очень сочитается с системой типов. Очень хорошая подборка связки. Не побоюсь этого слова, очень хороший ученый поработал. Это тот случай когда среди ограничений рождается что-то принципиально новое и сильное.
3)Ну да, Немерловый вывод типов много сильнее Хиндле-Милнера за счет того, что система типов .НЕТ используется в полной мере со всеми перегрузками, промоутингом и приведениями типов.
То есть вывод типов Хиндле-Милнер становится сильным только из-за правильно инженерно подобранной достаточно простой типизации в Хаскель. F# с Хиндле-Милнером сразу идет лесом, тк типизация используется из .НЕТ, но при этом убого ограниченная и не продуманная (как например в Хаскеле с её классами типов). Ну а в Немерле очень мощный вывод типов, тк работает с типизацией обычного C# без каких либо ограничений или специальной продуманнасти типизации как в Хаскеле. А стандартному Хиндле-Милнеру это и не снилось, что мы и видем на примере F#. Вывод типов F# просто не способен работать с типизацией уровня С#.
Я сам не понимаю, как мог думать, что интерфейсы и полиморфизм удел объектно-ориентированного программирования.
А вот те нате - в хаскелле всё это в сто раз элегантнее.
Я бы сказал в хаскелле всё-всё-всё элегантнее, а монады это лучший способ инкапсуляции состояния.
А почему вы так считаете? Мне что-то он не слишком понравился. Но надо мне ещё поработать с Хаски, чтобы составить более полное и аргументированное мнение.
1. Только строгая статическая типизация.
2. Никаких неявных преобразований, даже безопасных.
3. Удобная запись типов.
4. Удобный синтаксис шаблонов.
5. Кроссплатформенность.
6. Надёжность.
7. Ортогональность. Я ненавижу глупые исключения из правил.
8. Комбинируемость всех конструкций.
9. Элегантная и краткая форма записи.
Как видно Хаскелл подошёл по всем параметрам:
1. В хаскелле строгая статическая типизация.
2. В хаскелле нет неявных преобразований.
3. [a] и (a -> b) намного удобнее чем "std::vector<a>" и "b foo<a>" (сравнение не точное, но суть не меняется).
4. foo :: a -> a
5. GHC и Haskell Platform есть под Win, Mac, Lin.
6. За счёт строгой типизации, автовывода типов и чистоты хаскелл надёжнее чем все эти джавы вместе взятые.
7. Единственное исключение, найдённое мною в хаскелле - патерн-матчинг не позволяет использовать выражения вроде:
intsqrt( x^2 ) = x
8. ВСЁ КОМБИНИРУЕТСЯ. Тоесть вообще всё!
9. Код на хасскеле короче чем на перле и понятнее чем на питоне!
Есть только два недостатка, которые меня действительно волнуют - неполноценность типа Bool в стандартной библиотеке (хотя всё это решается) и отсутствие исчерпывающего учебника на русском языке.
MayBe Bool, нэ?
http://ideone.com/9LL4Ah
Изучай систему типов и стандартную библиотеку. А трибулы (а темболее велосипедные) это костыли.
Если конечно, у тебя не чуть ли вся программа на них построена, то конечно и они могут иметь место.
> Изучай систему типов и стандартную библиотеку
Why so didactic?
Хотя в троичной логике
Столкнешься с ленивым вводом-выводом, еще вспомнишь свои слова о надежности.
> Код на хасскеле короче чем на перле и понятнее чем на питоне!
А вот тут неправда. Функциональный код то короче, но когда пытаешься писать императивщину - то длиннее, и отступы быстро наматываются.
> 2. В хаскелле нет неявных преобразований.
что вы понимаете под ними, а то в том же ghc есть rewrite-rules
> 5. GHC и Haskell Platform есть под Win, Mac, Lin.
есть и аппаратная сторона, с тем же армом еще проблемы
> 7. Единственное исключение...
это уже вне сопоставления по образцу, а скорее в сторону пролога
> 9. Код на хасскеле короче чем на перле и понятнее чем на питоне!
очень спорно
> Есть только два недостатка, которые меня действительно волнуют...
"i have bad news for you", скорее это высокии барьер (что, впрочем, проблема экосиситемы, а не языка); сложно предсказуемая эффективность: незначительные изменения в коде могут кардинально влиять на производительность, нехватку или избыточность ленивости довольно тдудно выловить
Реальный код всё-равно приходится писать на си/плюсах/ас3/жабе...
PHP...
* По сравнению с python и javascript
* Если программист опытный.
** Если программист нуб или оптимизация по времени не требовалась.
selfix ночных посиделок
http://en.wikipedia.org/wiki/IEEE_1164