Haskell 一概而论什么都不是
假设我们想使用类似于Maybe的容器来处理可能失败的计算。如果我要为我想做的事情指定一个typeclass,它看起来像这样: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我应该用于此功能,还是应该只使用上面的类 编辑:更多的上下文 我正在尝试为逻辑编程实现匹配,我希望能够有一个“非模式”,即“如果且仅当此程
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中会有。