Haskell 一概而论什么都不是

Haskell 一概而论什么都不是,haskell,error-handling,typeclass,maybe,Haskell,Error Handling,Typeclass,Maybe,假设我们想使用类似于Maybe的容器来处理可能失败的计算。如果我要为我想做的事情指定一个typeclass,它看起来像这样: class Alternative f => Nullable f where isEmpty :: f a -> Bool 使得isEmpty x==True当且仅当x=empty 是否有一些现有的typeclass我应该用于此功能,还是应该只使用上面的类 编辑:更多的上下文 我正在尝试为逻辑编程实现匹配,我希望能够有一个“非模式”,即“如果且仅当此程

假设我们想使用类似于Maybe的容器来处理可能失败的计算。如果我要为我想做的事情指定一个typeclass,它看起来像这样:

class Alternative f => Nullable f where
  isEmpty :: f a -> Bool
使得
isEmpty x==True
当且仅当
x=empty

是否有一些现有的typeclass我应该用于此功能,还是应该只使用上面的类

编辑:更多的上下文


我正在尝试为逻辑编程实现匹配,我希望能够有一个“非模式”,即“如果且仅当此程序失败时成功,然后执行”

也许您可以以这种方式使用
可折叠的
<代码>可能,
[]
或者
错误
例外
都是可折叠的。您可以根据
toList
的结果进行模式匹配

如果您想用成功执行的结果做一些事情,而在失败的情况下什么都不做,您可以直接使用
表单


或者,您可以使用提供
null
谓词的typeclass from。

正如在对的注释中所预言的那样,base-4.8概括了
null
的类型,使其成为可折叠
容器的一个容易达到的空性测试:

GHCi> :t null
null :: Foldable t => t a -> Bool
GHCi> null Nothing
True
GHCi> null (Left "An error")
True
GHCi> null []
True
GHCi> import qualified Data.Map as Map
GHCi> null Data.Map.empty
True

是否认为a
可为空?
Left“A error”
的值在概念上并不是一个真正的空值,如果您要使用nullable的概念,那么只有少数类型可以真正应用它。您可以查看
Control.Monad.Trans.Error.Error
类,该类定义
noMsg::Error a=>a
strMsg::Error a=>String->a
,它与您想要执行的操作非常相似,只是添加了消息,而不仅仅是可为nullable添加了布尔标志。
如果任何类型a具有合理的默认值,则a
都是可为Null的。在我看来,
Nullable
的意义更多的是泛化
Maybe
,这样我就可以编写通常在
Maybe
中的代码,同时从特定的容器中抽象出来。而且,
Control.Monad…Error
实际上不起作用,因为我无法测试它是否是错误并以某种方式处理它。我想模拟一些东西,比如导出一些结构来帮助处理故障。您可以使用
catchError
包装语句块,这些语句块可以调用
throwError
并处理错误。我认为这可能包含了您的
null
用例,尽管我没有时间来编写完整的示例。或者使用
foldMap
All
来定义
null=getAll。foldMap(const$All False)
@PetrPudlák,为什么不干脆
null=Data.Foldable.All(const-False)
?或者等待base 4.8:-)@dfeuer True,甚至更好:)。是的,在base-4.8中会有。