1

我正在尝试解决以下问题——给定所有选择器(e^i_n)和一些布尔函数({f_1, f_2, f_n})枚举闭包中 n 个参数的所有函数(在 [f_1,f_2,..f_n] 中)。

所以,我实现了 BooleanFunctionClass 和存在的 BooleanFunction 类型。他们是 Haskell 的反对派精神吗?

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。

4

1 回答 1

1

我不确定您要实现的确切目标,但是如果您希望在编译时检查 arity,则列表可能无法完成这项工作(正如您在评论中所建议的那样)。

您将需要元组或类似的东西。处理可变大小元组的最好方法是 Template Haskell。此外,TupleTH已经为您完成了很多关于以类型安全的方式处理元组的工作。

于 2012-08-30T07:39:25.030 回答