haskell函数给出boolean的类型签名

时间:2015-02-16 04:13:35

标签: haskell

如果我有这种类型的签名,我应该写什么函数来满足它?

allPair :: [a -> b -> Bool] -> [(a,b)] -> Bool 

我唯一知道的是==类型a -> a -> Bool

如果应用于相应对值的所有函数都返回True,则返回True - 否则返回False。 如果有不同数量的函数和对,它也会返回false。

1 个答案:

答案 0 :(得分:1)

有许多可能的实现,但看起来你正在寻找的是一个函数,它接受[a -> b -> Bool]列表的第一个元素并将其应用于从{{的第一个元素获取的值。 1}}列表生成一个[(a, b)],它将Bool与第二个元素,第三个元素等的类似输出一起编辑。

这是一个执行此操作的函数,假设没有数据的基本情况评估为&&,并且每当有多个函数而不是arg-pair,或者arg-pairs多于函数时,它应该是True

False
例如

allPair :: [a -> b -> Bool] -> [(a, b)] -> Bool
allPair [] [] = True
allPair _ [] = False
allPair [] _ = False
allPair (f:fs) ((a,b):vals) = (f a b) && (allPair fs vals)

请注意,此函数假定传递给它的参数将具有兼容的长度(或者当它们不可接受时返回Prelude> allPair [(>), (<)] [(3, 1), (10, 2)] False Prelude> allPair [(>), (<)] [(3, 1), (2, 10)] True )。如果你想实际使用类型系统来强制匹配False参数的arity,那么它非常棘手并涉及语言扩展。