我想编写一个非常类似于filter的函数,使用带有列表的奇数函数并返回带有任何奇数平方的列表。
离
gchi> sqrodd [1,2,3,4,5]
[1,2,9,4,25]
我所拥有和相信的是接近
sqrodd :: (a->Bool) -> [a] -> [a]
sqrodd odd [] = []
sqrodd odd (x:xs) = if odd x
then (x*x) :sqrodd odd xs
else x : sqrodd odd xs
但是我的功能定义出现错误,说"无法将预期类型a -> Bool
与实际类型[a]
"
答案 0 :(得分:6)
您的sqrodd
函数有两个参数:第一个是奇数谓词a -> Bool
,第二个是元素列表[a]
。在您的示例用法中,您将[1..5]
作为第一个参数,而不是a -> Bool
谓词。
但是,您真正想要的是不有两个参数,即将sqrodd
更改为单参数函数sqrodd :: [a] -> [a]
并使用the function odd
from the Prelude。
请注意,您的sqrodd
类型仍然需要更严格一些,因为您可以对任何元素应用odd
或(*)
输入a
;一旦你到达那个下一个障碍,你可能想要阅读类型类。
答案 1 :(得分:5)
正如您自己写的那样,您需要一个以列表作为参数并返回另一个列表的函数,因此不需要使用类型签名
sqrodd :: (a->Bool) -> [a] -> [a]
您应该使用类似于此
的类型签名创建一个函数 sqrodd :: [a] -> [a]
这正是你在开头写的。 由于编译器期望,该函数的第一个参数将是(a - > bool)的函数。 您应该从参数列表中删除奇数并更改类型签名,如上所示。这将导致函数使用前缀中的奇数而不是期望过滤函数作为参数。
另一种方法是重命名你的功能,例如sqrfiltered,然后你可以将sqrodd定义为部分应用的sqrfiltered
sqrodd = sqrfiltered odd
未经测试,但应该是正确的。
答案 2 :(得分:0)
过滤器函数检查列表中的每个元素,并返回仅包含满足条件的元素的新列表。
但你想要完成的是将列表转换为新列表;新列表具有与旧列表相同数量的元素。你没有过滤掉任何东西;您根据某些规则将元素从一个列表映射到另一个列表。
以下是编写函数的两种可能方法。
WHERE {$dbpraefix}pages.alias = $_GET['include']"