4
我有一種情況,我正在使用的大多數操作都是部分函數。我希望函數的返回類型根據上下文的不同而不同,後者應確定發生的異常處理類型以及報告的錯誤類型。我目前的解決方案是定義一個由錯誤類型參數化的函數,然後使用類型類作爲開放函數實現該操作。例如,以下是頭的實現中,假定的合適的實現錯誤和的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"
這種實現的優點是根據頭部被調用的上下文可以拋出不同的錯誤。我的問題是,如果不使用輔助操作和打開的函數定義函數,是否可以完成此操作。如果不是,第二個問題是這個解決方案是否是最優的。特別是,有沒有更好的方法來實現這種行爲?
您可能想看看[failure](http://hackage.haskell.org/packages/archive/failure/latest/doc/html/Control-Failure.html)軟件包。 – hammar
我只是定義了適合情況的返回類型的函數,比如'Maybe a'和'或者b'。這些類型有很多接口,已經定義爲類實例。對失敗做出反應很容易。 –
我認爲你發佈的代碼在'class'聲明中交換了'm'和'e',是的? – huon