2012-11-06 25 views
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" 

這種實現的優點是根據頭部被調用的上下文可以拋出不同的錯誤。我的問題是,如果不使用輔助操作和打開的函數定義函數,是否可以完成此操作。如果不是,第二個問題是這個解決方案是否是最優的。特別是,有沒有更好的方法來實現這種行爲?

+1

您可能想看看[failure](http://hackage.haskell.org/packages/archive/failure/latest/doc/html/Control-Failure.html)軟件包。 – hammar

+0

我只是定義了適合情況的返回類型的函數,比如'Maybe a'和'或者b'。這些類型有很多接口,已經定義爲類實例。對失敗做出反應很容易。 –

+1

我認爲你發佈的代碼在'class'聲明中交換了'm'和'e',是的? – huon

回答