如果我有这种类型的签名,我应该写什么函数来满足它?
allPair :: [a -> b -> Bool] -> [(a,b)] -> Bool
我唯一知道的是==
类型a -> a -> Bool
。
如果应用于相应对值的所有函数都返回True,则返回True - 否则返回False。 如果有不同数量的函数和对,它也会返回false。
答案 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,那么它非常棘手并涉及语言扩展。