Эти два combinators уже доступны в Haskell?

Мне нужен двоичный файл combinators типа

(a -> Bool) -> (a -> Bool) -> a -> Bool

или возможно

[a -> Bool] -> a -> Bool

(хотя это просто было бы foldr1 первого, и я обычно только должен объединить две булевых функции.)

Они встроены?


В противном случае реализация проста:

both f g x = f x && g x
either f g x = f x || g x

или возможно

allF fs x = foldr (\ f b -> b && f x) True fs
anyF fs x = foldr (\ f b -> b || f x) False fs

Hoogle ничего не поднимает, но иногда его поиск не делает вывод правильно. Какая-либо идея, если они встроены? Они могут быть созданы из частей существующей библиотеки?

Если они не встроены, Вы могли бы предложить новые имена, потому что эти имена довольно плохи. На самом деле это - главная причина, я надеюсь, что они встроены.

8
задан Nathan Shively-Sanders 4 February 2010 в 18:16
поделиться

3 ответа

Control.Monad определяет монаду экземпляра ((->) r) , поэтому

ghci> :m Control.Monad
ghci> :t liftM2 (&&)
liftM2 (&&) :: (Monad m) => m Bool -> m Bool -> m Bool
ghci> liftM2 (&&) (5 <) (< 10) 8
True

вы можете то же самое с Control.Applicative.liftA2 .


Не чтобы серьезно предлагать это, но ...

ghci> :t (. flip ($)) . flip all
(. flip ($)) . flip all :: [a -> Bool] -> a -> Bool
ghci> :t (. flip ($)) . flip any
(. flip ($)) . flip any :: [a -> Bool] -> a -> Bool
13
ответ дан 5 December 2019 в 08:23
поделиться

Это то, о чем нужно беспокоиться. Компилятор обнаружил, что код в базовом классе может выполняться. Это не будет чисто виртуальный метод, он знает, как их фильтровать. Может, конструктор или деструктор? Режим отказа заключается в том, что формат памяти объекта класса может отличаться в коде клиента от DLL. Причиной этого является очень трудно диагностировать.

Вы будете в порядке, если только вы можете гарантировать, что клиент и DLL скомпилированы с точно такими же параметрами настройки компиляции и ссылки, используя точно такие же версии CRT и этих инструментов. Базовый класс можно сделать гарантированным абстрактным с помощью нестандартного ключевого слова интерфейса __ вместо класса.

-121--5044561-

Outlook не соответствует каким-либо стандартам нумерации недель. Он имеет две настройки, определяющие нумерацию недель, называемые «Первый день недели» и «Первая неделя года».

Установив для параметра «Первый день недели» значение «Понедельник», а для параметра «Первая неделя года» значение «Первая 4-дневная неделя», можно смоделировать стандарт ISO.

Каждый пользователь должен будет произвести эту корректировку в соответствии со стандартом ISO.

Я не знаю отдельного стандарта США, и, по-видимому, как и Outlook.

-121--3653472-

Я не знаю строений, но мне нравятся имена, которые вы предлагаете.

getCoolNumbers = filter $ either even (< 42)

Альтернативно, можно было бы придумать символ оператора в дополнение к классам для альтернативных вариантов.

getCoolNumbers = filter $ even <|> (< 42)
1
ответ дан 5 December 2019 в 08:23
поделиться

Это не встроенная функция, но я предпочитаю использовать классы типов. в обобщить логические операции на предикаты любой арности:

module Pred2 where

class Predicate a where
  complement :: a -> a
  disjoin    :: a -> a -> a
  conjoin    :: a -> a -> a

instance Predicate Bool where
  complement = not
  disjoin    = (||)
  conjoin    = (&&)

instance (Predicate b) => Predicate (a -> b) where
  complement = (complement .)
  disjoin f g x = f x `disjoin` g x
  conjoin f g x = f x `conjoin` g x


-- examples:

ge :: Ord a => a -> a -> Bool
ge = complement (<)

pos = (>0)
nonzero = pos `disjoin` (pos . negate)
zero    = complement pos `conjoin` complement (pos . negate)

Я люблю Haskell!

6
ответ дан 5 December 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: