2011-05-03 128 views
3

我想從幾個自定義類(稱爲Monomial和Polynomial)的Num聲明中提取一些樣板。而不是寫作Haskell默認超類實例

instance Num (Monomial) where 
    f - g = f + (negate g) 
    abs _ = undefined 

有沒有辦法解決這個問題?我碰到default superclass instances和一些所謂來到「the strathclyde haskell enhancement」如果執行這些可能讓我喜歡寫東西,

class SimpleNum a => Num a where 
    (+) :: a -> a -> a -- standard ring stuff 
    (*) :: a -> a -> a 
    one :: a 
    zero :: a 
    instance Num (SimpleNum a) where 
     f - g = f + (negate g) 
     abs _ = undefined 

什麼是處理這個問題通常/簡單的方法?

+1

也許這是部分民不是很好的設計的問題,也就是說,它應該是AbelianGroup =>戒指=>民... – gatoatigrado 2011-05-03 03:30:08

+0

這其中一部分,但是我們不能根據更具體的類型成員的方式來默認使用較不具體的類型類的方法,所以這樣做也會太吸引:-(儘管至少我們的代碼不會必須有所有這些無端的底部... – SamB 2011-05-03 04:31:04

+2

SHE *是*實現。我不知道這個功能是否,但SHE是一個真正的預處理器,你可以使用。 – luqui 2011-05-03 06:54:19

回答

2

處理這個的通常方式是做至少一個或多個以下:

  1. 嘰了很多。

  2. 寫輔助函數是這樣的:

 
simpleMinus f g = f + (negate g) 
  1. 等工具Template HaskellDerive

  2. 嘗試實施類似於您提到的擴展程序。 (這不幸的是沒有那麼容易,因爲你的想象。)

+0

謝謝,我可能只是寫這個時間,因爲我只有幾個函數,但很好的瞭解模板哈斯克爾和派生。 – gatoatigrado 2011-05-03 04:27:41