Haskell-如果高阶函数以函数作为参数,那么它的输入看起来是什么样的?

Haskell-如果高阶函数以函数作为参数,那么它的输入看起来是什么样的?,haskell,higher-order-functions,Haskell,Higher Order Functions,我正在与Haskell合作,并试图实现一个高阶函数,但我在理解和测试该函数时遇到了困难,因为我不确定输入会是什么样子 由于函数本身是分级赋值的一部分,因此我无法寻求有关编写/实现函数本身的帮助,因此我更改了函数名称和自定义类型名称,因此我可以使用函数作为示例,说明如果要在控制台中键入输入参数,输入参数会是什么样子 search :: ([(Int,Int)] -> [[(Int,Int)]]) -> ([(Int,Int)] -> Bool) -> [[(Int,Int)

我正在与Haskell合作,并试图实现一个高阶函数,但我在理解和测试该函数时遇到了困难,因为我不确定输入会是什么样子

由于函数本身是分级赋值的一部分,因此我无法寻求有关编写/实现函数本身的帮助,因此我更改了函数名称和自定义类型名称,因此我可以使用函数作为示例,说明如果要在控制台中键入输入参数,输入参数会是什么样子

search :: ([(Int,Int)] -> [[(Int,Int)]]) -> ([(Int,Int)] -> Bool) -> [[(Int,Int)]] -> Maybe [(Int,Int)]
search function1 function2 listOfIntegerPairs
function1将整数对列表作为输入,并输出包含整数对的列表

function2获取整数对列表并输出布尔值

我不确定如何将这个高阶函数的参数输入控制台

search :: ([(Int,Int)] -> [[(Int,Int)]]) -> ([(Int,Int)] -> Bool) -> [[(Int,Int)]] -> Maybe [(Int,Int)]
search function1 function2 listOfIntegerPairs
i、 我们将函数和它的参数作为参数,是这样的吗

search (function1([(0,0),(0,1)])) (function2([(0,0),(0,1)])) [(0,0),(0,1)]
此表单会产生错误,但我无法确定输入参数是什么样的,并且很难找到任何说明此表单的文章/教程。因此,在我计算出输入函数参数的类型之前,我无法测试函数

有人能给我一些指导吗?我所问的可能吗?

Data.List中的函数也有类似的类型

find :: (a -> Bool) -> [a] -> Maybe a
在不显示
find
s定义的情况下,我们可以尝试在ghci中使用它。首先,我们需要导入
数据。List
,因为它是在那里定义的

> import Data.List
传递一个声明的函数
find
的第一个参数表示它需要一个类型为
a->Bool
的函数。要将参数传递给
find
,我们将整个函数传递给它。我们不需要首先调用该函数,也不需要给出该函数的参数,我们可以将该函数视为普通值,并将整个函数传递给
find
。这种将功能视为普通价值观的能力是我们谈论语言的“作为一等公民的功能”的意思;我们可以用其他类型的函数做任何事情。要传递要查找的内容,我们需要首先定义它

> let divisibleBy3 x = x `mod` 3 == 0
现在,我们将把整个
divisibleBy3
函数作为第一个参数传递给
find
。作为第二个参数,我们将传递一个包含我们想要查找的内容的列表,
[4,7,9,10]

> find divisibleBy3 [4, 7, 9, 10]
Just 9
传递一个lambda Haskell提供了定义函数的其他方法,该函数仅引用已定义的函数。lambda构造了一个新的。如果构造的函数具有正确的类型,我们可以将其作为第一个参数传递给
find

> find (\x -> x*3 == x + 8) [1,2,3,4,5,6,7,8,9,10]
Just 4
通过结果 函数类型既可以显示为函数的参数,也可以显示为函数的结果。这意味着我们可以生成生成新函数的函数。我们可以编写函数组合运算符,
,作为普通函数声明。为此,我们首先需要在序曲中隐藏定义

> import Prelude hiding ((.))
> let f . g = \x -> f (g (x))
用右边的lambda编写它强调,当只应用于两个参数时,函数组合返回一个函数。在任何需要函数的地方,我们都可以传递任何具有正确类型的表达式。这意味着我们可以将
的结果传递到
find
中。这还意味着我们可以将这些方法中定义的函数作为参数传递给

> find (not . odd) [1, 1, 2, 3, 5, 8]
Just 2

> find (not . divisibleBy3 . (\x -> x*(x+1))) [2, 3, 4, 5, 6]
Just 4
通过部分申请 当我们定义一个函数,比如

same :: Int -> Int -> Bool
same x y = x - y == 0
same
类型中的函数类型构造函数
->
是右关联的,这意味着右边的事物在左边的事物之前被分组在一起

same :: Int -> (Int -> Bool)
添加这些括号后,我们可以看到,
same
,它看起来像一个有两个参数的函数,可以被视为一个只有一个参数的函数,
Int
,它返回一个函数,
Int->Bool
。我们可以使用函数生成作为参数传递的函数

> let same x y = x - y == 0
> find (same 7) [1..10]
Just 7

最好让类型签名与您的问题相同。
a->[a]
类型不是“将整数对列表作为输入并输出包含整数对的列表”的函数,而是获取值并返回值列表的函数。这可以专用于您想要的内容,但您也可以传递它,例如a
Bool
。此外,高阶函数的要点是将另一个函数作为参数传递,而不是另一个函数的结果,这是正则阶函数。尝试
search function1 function1[(0,0),(0,1)]
。最简单的方法可能是明确定义函数:
myFunction1::bool->[bool]myFunction1 b=[true,false,b]
或您希望的
myFunction1
是什么。然后可以将
myFunction1
作为参数传递。确切地说,
search
函数的调用方式与声明的方式相同。想想
map
函数:
map length[“this”,“is”,“a”,“test”]
将返回
[4,2,1,4]
,它不被称为
map(length[“this”,“is”,“a”,“test”])[“this”,“is”,“a”,“test”]
,反正它不会是一样的,因为它会简化为
map 4[“this”,“is”,“a”,“test”]
,因为参数列表的长度为4,映射“function
4
”是毫无意义的。哎呀,我应该说函数function1和function2是在文档的其他地方明确定义的,我不允许更改函数使用的类型声明。让我困惑的是function1和function2从哪里获得参数?他们会把积分榜作为自己的论据吗?i、 e.搜索函数1函数2[(0,0),(1,0)]?@Wolff我不是说您应该更改类型声明,只是您应该编辑您的问题,以便
搜索
函数具有