Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 按错误类型参数化部分函数_Haskell_Error Handling_Typeclass - Fatal编程技术网

Haskell 按错误类型参数化部分函数

Haskell 按错误类型参数化部分函数,haskell,error-handling,typeclass,Haskell,Error Handling,Typeclass,我使用的大多数操作都是部分函数。我希望函数的返回类型根据上下文的不同而有所不同,上下文应确定发生的异常处理类型以及报告的错误类型。我当前的解决方案是定义一个由错误类型参数化的函数,然后使用类型类将该操作实现为一个开放函数。例如,以下是head的实现,假设错误和MonadError的适当实现可能与单元类型有关: class (Error e, MonadError e m) => Head m e | m -> e where head :: [a] -> m a erro

我使用的大多数操作都是部分函数。我希望函数的返回类型根据上下文的不同而有所不同,上下文应确定发生的异常处理类型以及报告的错误类型。我当前的解决方案是定义一个由错误类型参数化的函数,然后使用类型类将该操作实现为一个开放函数。例如,以下是head的实现,假设错误和MonadError的适当实现可能与单元类型有关:

class (Error e, MonadError e m) => Head m e | m -> e where
  head :: [a] -> m a

errorHead :: (Error e, MonadError e m) => e -> [a] -> m a
errorHead e []       = throwError e
errorHead e (x : xs) = return x

instance Head Maybe () where
  head = errorHead ()

instance Head (Either String) String where
  head = errorHead "error: empty list"

此实现的优点是,根据调用head的上下文,可以抛出不同的错误。我的问题是,这是否可以在不使用辅助操作和开放函数定义函数的情况下实现。如果不是,第二个问题是这个解决方案是否最优。特别是,有没有更好的方法来实现这种行为?

这个包有很多实用程序,可以在
Maybe
或者
MaybeT
之间移动。您可能想看看这个包。我只需要定义适合这种情况的返回类型的函数,例如
可能是a
或者是a b
。这些类型有很多接口,已经定义为类实例。然后很容易对失败做出反应。我认为您发布的代码在
声明中交换了
m
e
,是吗?还可以看看非常酷的hammar,jberryman:感谢您对失败和控制monad异常包的引用。通过快速调查,两者似乎都实现了我想要的部分或全部功能,而没有我实现时的尴尬。