- 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
bormand 08.11.2012 21:03 # +2
Fai 08.11.2012 22:32 # +2
bormand 08.11.2012 22:35 # +2
Fai 08.11.2012 22:51 # +2
LispGovno 09.11.2012 00:15 # +3
3.14159265 08.11.2012 21:08 # +2
bormand 08.11.2012 21:36 # +1
> Хрен переопределишь:
http://ideone.com/nG59NT
Fai 08.11.2012 21:41 # +1
Fai 08.11.2012 21:43 # 0
x || y = max x y
x && y = min x y
Ну а not проще никак не сделать.
Fai 08.11.2012 21:49 # 0
А то, что я правильно написал - класса Logical c операторами && || not - нет! Num - есть, Fractional - есть, Integral - есть, Eq, Show, Read, Ord и т.д. и т.п - всё есть.
А класса для реализации произвольной логики - нет! Есть всего-лишь недотип data Bool...
bormand 08.11.2012 21:57 # +3
http://ideone.com/rXQ0lw
Fai 08.11.2012 22:02 # 0
LispGovno 08.11.2012 22:32 # −2
Мне остаётся только восхищаться.
bormand 08.11.2012 22:40 # +1
LispGovno 08.11.2012 22:55 # +1
LispGovno 08.11.2012 23:13 # −2
3.14159265 08.11.2012 23:19 # +2
Какое у тебя самомнение. Лучше вообще не пиши говно, ок?
LispGovno 09.11.2012 00:17 # 0
Не. Это мнение о типизации слишком низкое. Рядом есть много более перспективных типизаций, а майкрософт выбрала самую простую и кривую.
roman-kashitsyn 08.11.2012 23:48 # +3
Помнится, кто-то катил бочку на Хиндли-Милнера
> Хиндли-Милнер - детский сад и в Немерле не применяется
http://govnokod.ru/11658#comment152370
LispGovno 09.11.2012 00:10 # 0
1) В Хаскеле вроде модификация Хиндли-Милнера, в отличие от F#, где он более чистый.
2) Я сказал, что эта типизация подходит Хаскелю. Типизация ~= система типов + система вывода типов.
Так вот в Хаскеле система вывода типов очень сочитается с системой типов. Очень хорошая подборка связки. Не побоюсь этого слова, очень хороший ученый поработал. Это тот случай когда среди ограничений рождается что-то принципиально новое и сильное.
3)Ну да, Немерловый вывод типов много сильнее Хиндле-Милнера за счет того, что система типов .НЕТ используется в полной мере со всеми перегрузками, промоутингом и приведениями типов.
То есть вывод типов Хиндле-Милнер становится сильным только из-за правильно инженерно подобранной достаточно простой типизации в Хаскель. F# с Хиндле-Милнером сразу идет лесом, тк типизация используется из .НЕТ, но при этом убого ограниченная и не продуманная (как например в Хаскеле с её классами типов). Ну а в Немерле очень мощный вывод типов, тк работает с типизацией обычного C# без каких либо ограничений или специальной продуманнасти типизации как в Хаскеле. А стандартному Хиндле-Милнеру это и не снилось, что мы и видем на примере F#. Вывод типов F# просто не способен работать с типизацией уровня С#.
bormand 08.11.2012 22:42 # +3
LispGovno 08.11.2012 22:57 # −2
Fai 08.11.2012 23:39 # +2
bormand 09.11.2012 05:49 # +1
Fai 09.11.2012 17:40 # +1
bormand 09.11.2012 18:14 # 0
Fai 09.11.2012 18:45 # 0
Fai 08.11.2012 23:43 # +2
Я сам не понимаю, как мог думать, что интерфейсы и полиморфизм удел объектно-ориентированного программирования.
А вот те нате - в хаскелле всё это в сто раз элегантнее.
Я бы сказал в хаскелле всё-всё-всё элегантнее, а монады это лучший способ инкапсуляции состояния.
LispGovno 09.11.2012 00:19 # 0
А почему вы так считаете? Мне что-то он не слишком понравился. Но надо мне ещё поработать с Хаски, чтобы составить более полное и аргументированное мнение.
Fai 09.11.2012 00:35 # +2
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 в стандартной библиотеке (хотя всё это решается) и отсутствие исчерпывающего учебника на русском языке.
LispGovno 09.11.2012 01:08 # −3
MayBe Bool, нэ?
Fai 09.11.2012 02:57 # 0
LispGovno 09.11.2012 03:56 # 0
http://ideone.com/9LL4Ah
Изучай систему типов и стандартную библиотеку. А трибулы (а темболее велосипедные) это костыли.
Если конечно, у тебя не чуть ли вся программа на них построена, то конечно и они могут иметь место.
Fai 09.11.2012 17:41 # 0
roman-kashitsyn 09.11.2012 17:57 # +2
> Изучай систему типов и стандартную библиотеку
Why so didactic?
Fai 10.11.2012 06:03 # +2
Хотя в троичной логике
LispGovno 10.11.2012 09:42 # +1
bormand 10.11.2012 09:53 # +1
bormand 09.11.2012 05:51 # +2
Столкнешься с ленивым вводом-выводом, еще вспомнишь свои слова о надежности.
> Код на хасскеле короче чем на перле и понятнее чем на питоне!
А вот тут неправда. Функциональный код то короче, но когда пытаешься писать императивщину - то длиннее, и отступы быстро наматываются.
guest 09.11.2012 09:09 # +4
> 2. В хаскелле нет неявных преобразований.
что вы понимаете под ними, а то в том же ghc есть rewrite-rules
> 5. GHC и Haskell Platform есть под Win, Mac, Lin.
есть и аппаратная сторона, с тем же армом еще проблемы
> 7. Единственное исключение...
это уже вне сопоставления по образцу, а скорее в сторону пролога
> 9. Код на хасскеле короче чем на перле и понятнее чем на питоне!
очень спорно
> Есть только два недостатка, которые меня действительно волнуют...
"i have bad news for you", скорее это высокии барьер (что, впрочем, проблема экосиситемы, а не языка); сложно предсказуемая эффективность: незначительные изменения в коде могут кардинально влиять на производительность, нехватку или избыточность ленивости довольно тдудно выловить
Fai 09.11.2012 00:41 # +2
Реальный код всё-равно приходится писать на си/плюсах/ас3/жабе...
bormand 09.11.2012 05:54 # +2
PHP...
roman-kashitsyn 09.11.2012 00:23 # +2
Fai 09.11.2012 00:37 # +2
LispGovno 09.11.2012 04:48 # −1
bormand 09.11.2012 05:57 # 0
* По сравнению с python и javascript
LispGovno 09.11.2012 08:58 # +1
bormand 09.11.2012 18:17 # +1
* Если программист опытный.
** Если программист нуб или оптимизация по времени не требовалась.
LispGovno 09.11.2012 08:55 # −1
selfix ночных посиделок
LispGovno 08.11.2012 22:40 # −3
http://en.wikipedia.org/wiki/IEEE_1164
LispGovno 09.11.2012 04:07 # −1
Fai 09.11.2012 04:15 # +3