创建一个获取Int列表的函数,并返回带有任何奇数平方的列表

时间:2016-09-13 04:05:38

标签: haskell

我想编写一个非常类似于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]"

匹配

3 个答案:

答案 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']"