我有类似这样的类型函数
function :: Eq a => a -> (b -> c -> a) -> b -> [(d,c)] -> Bool
但我不能称之为。任何人都可以给我一个例子:例如函数a b c带有一个例子吗?
答案 0 :(得分:1)
这种类型非常普遍,很难推断出该功能的实际功能。但是,由于a
,b
,c
和d
几乎没有约束,所以让我们举例说明它们都满足Int
:
function (3::Int) (+) 5 [(1,2), (3,4)]
第一个参数必须是a
类型,唯一的约束是它是Eq
的实例。 3 :: Int
满足了这一要求。
第二个参数只需要是一个返回Int
的双参数函数。 (+)
满足了这一要求,同时也修复了b ~ c ~ Int
。
第三个参数也必须是b ~ Int
类型。
对于任何类型[(d, Int)
,最后一个参数只需要是d
]类型的列表。我们只传递一对Int
s。
答案 1 :(得分:1)
看起来你有一些复杂的功能,它使用辅助函数检查关联列表中的成员资格。
您提供的功能:
function :: Eq a => a -> (b -> c -> a) -> b -> [(d,c)] -> Bool
采取三个论点:
a
,b -> c -> a
,b
的参数,[(d, c)]
。然后,您提供的类型的一个可能功能是:
function :: Eq a => a -> (b -> c -> a) -> b -> [(d,c)] -> Bool
function a f b ((_,c):rest) = ((f b c) == a) || (function a f b rest
function a f b rest = False
通过忽略元组的第一个元素并将辅助函数应用于元组的第二个参数来检查列表中的成员资格。
虽然这个功能看起来很复杂,但你可以用一个相当简单的例子来运行它
function True (==) 0 [("a", 0), ("b",1)]
在上面的示例中,我们正在使用0
辅助函数查找(==)
,并检查辅助函数是否返回True
。