Итак, предположим, что мы хотим иметь дело с вычислениями, которые могут завершиться неудачно, используя контейнер, подобный Maybe. Если бы я был указать на то, что класс типов я хочу сделать, это было бы выглядеть примерно так:Обобщение isNothing
class Alternative f => Nullable f where
isEmpty :: f a -> Bool
Такое, что isEmpty x == True
тогда и только тогда, когда x = empty
Есть некоторые существующие класс типов, которые я должен использовать для этой функции или я должен просто использовать класс выше?
EDIT: Некоторые больше контекста
Я пытаюсь реализовать соответствие для логического программирования, и я хочу, чтобы иметь возможность иметь «не образец», т.е. «добиться успеха, если и только если эта программа не выполняется, то делать ___».
Является ли 'Либо' считающимся допустимым? Значение 'Left 'Ошибка« на самом деле не является нулевым значением концептуально, существует только несколько типов, к которым это действительно может быть применено, если вы идете к концептуальному понятию обнуляемости. Вы можете посмотреть класс 'Control.Monad.Trans.Error.Error', который определяет' noMsg :: Error a => a' и 'strMsg :: Error a => String -> a', он очень похож на то, что вы хочу делать, а добавлять сообщения вместо простого логического флага для обнуления. – bheklilr
'Либо a' является допустимым, если для любого типа a, имеющего разумное значение по умолчанию. Точка «Nullable» в моем сознании была скорее обобщением «Maybe», так что я мог написать код, который обычно находился бы внутри «Maybe», абстрагируясь от этого конкретного контейнера. Кроме того, 'Control.Monad ... Error' на самом деле не работает, поскольку я не могу проверить, является ли это ошибкой и каким-то образом обрабатывает ее. Я хочу подражать чему-то вроде «case x of (Just xs -> ...) (Nothing -> ...)' – gallabytes
['Control.Monad.Error'] (https://hackage.haskell.org/package /mtl-1.1.0.2/docs/Control-Monad-Error.html) экспортирует некоторые структуры, чтобы помочь справиться с ошибками. Вы можете использовать 'catchError', чтобы обернуть блок операторов, который может вызывать' throwError' и обрабатывать ошибку. Я думаю, что это, вероятно, включает ваш «нулевой» прецедент, хотя у меня нет времени, чтобы выработать полный пример. –