2012-08-29 152 views
1

我想解決以下問題 - 給定所有選擇器(e^i_n)和一些布爾函數({f_1, f_2, f_n})枚舉閉包中的n個參數的所有函數(在[f_1,f_2,.. f_n] )。Haskell布爾函數實現

所以,我實現了BooleanFunctionClass和existencial BooleanFunction類型。 他們是哈斯克爾的狂妄精神嗎?

class BooleanFunctionClass a where 
    arity :: a -> Int 

instance BooleanFunctionClass Bool where 
    arity _ = 0 

instance BooleanFunctionClass a => BooleanFunctionClass (Bool -> a) where 
    arity f = arity (f True) + 1 

data BooleanFunction = forall a. (BooleanFunctionClass a) => BooleanFunction a String 
instance Show BooleanFunction where 
    show (BooleanFunction _ str) = show str 

但我不知道如何實現選擇(的n個參數函數,該函數返回第k個)。 我想要selector :: Int -> Int -> BooleanFunction。有什麼建議麼?

PS。抱歉。我不知道,如何在Markdown中插入TeX。

+1

將布爾函數建模爲BooleanFunction {arity :: Int,f :: [Bool] - > Bool}'會更容易。 –

+0

我會嘗試這種方法,但它不是數學風格。 – KAction

+0

你能舉一個你想要它做什麼的例子嗎? – augustss

回答

1

我不確定你想要達到什麼目的,但是如果你想在編譯時檢查arity,列表可能不會完成這項工作(正如你在評論中所建議的那樣)。你需要元組或其他類似的元組。處理可變大小元組的最好方法是Template Haskell。另外TupleTH已經爲您以類型安全的方式處理元組做了很多工作。

+0

編號元組不起作用,因爲我無法部分應用。 我想避開TH,但似乎失去了希望。 – KAction