В Хаскеле есть операции && и || для логических значений. Их тип фиксирован, это (&&), (||) :: Bool -> Bool -> Bool.
В результате те, кому мало Prelude, делают свои классы для своих операций, где те же самые операции уже перегружены по носителю: (&&), (||) :: Constraint f => f Bool -> f Bool -> f BoolИ эти же операции перекрываются с операциями из
(
Read more... )
Comments 7
Вовсе нет. В Data.Bits операции, работающие с короткими векторами битов, упомянутым там самое место. С логическими (&&) и (||) они не пересекаются, ни по смыслу, ни по типам, ни по семантике (что там у (.|.) с ленивостью, например?).
Reply
По типам пересекаются. Bool -> Bool -> Bool частный случай a -> a -> a.
Смысл тоже один. || - это побитовое ИЛИ для однобитных значений. То есть, это .|. для значений типа Bool.
Я все это написал потому, что вот уже который раз пытаюсь правильно спроектировать классы для логических и побитовых операций, чтобы самому с ума не сойти и другим можно было объяснить.
Reply
Ну, будет True `shift` 0 = True, а всё остальное False...
Reply
Те же связки &&, || и xor вполне подходят, допустим, для логических значений с null (sql). Где там сдвиг?
Лучше разбить на два класса.
Reply
С векторами, понятное дело, можно творить гораздо больше фокусов. Сдвиг, переворот, скалярное произведение - всё то, что для множеств бессмысленно.
Хотя, сдвиг - это инкремент всех элементов множества, а переворот - это вычитание... если элементы множества - отрезок целых чисел.
Тогда получится не Data.Bits (который Num a => Bits a, что как бы намекает, что это, всё-таки, относится к числам, а не к чему попало), а какие-нибудь
Abstract.BooleanAlgebra и Abstract.BooleanVectorSpace
Reply
Reply
fix (`shiftLogical` 1) x = 0.
В любом направлении.
Reply
Leave a comment