Wol*_*lff 2 haskell higher-order-functions
我正在使用Haskell,并尝试实现更高阶的函数,但我无法理解和测试函数,因为我不确定输入是什么样的.
由于函数本身是分级赋值的一部分,我不能请求有关编写/实现函数本身的帮助,因此我更改了函数名称和自定义类型名称,因此我可以使用该函数作为示例如果要将它们输入控制台,输入参数将如下所示.
search :: ([(Int,Int)] -> [[(Int,Int)]]) -> ([(Int,Int)] -> Bool) -> [[(Int,Int)]] -> Maybe [(Int,Int)]
search function1 function2 listOfIntegerPairs
Run Code Online (Sandbox Code Playgroud)
function1将整数对列表作为输入,并输出包含整数对的列表列表.
function2获取整数对列表并输出一个布尔值.
我不确定如何将这个高阶函数的参数输入控制台.
即它是这样的,我们包括函数和它的参数作为参数?
search (function1([(0,0),(0,1)])) (function2([(0,0),(0,1)])) [(0,0),(0,1)]
Run Code Online (Sandbox Code Playgroud)
这个表单会产生错误,但是我无法弄清楚输入参数会是什么样子,并且无法找到说明它的任何文章/教程.因此,我无法测试函数,直到我找出输入函数参数看起来像类型的东西.
谁能给我一些指导?我甚至可能要问什么?
该find函数Data.List具有类似的类型.
find :: (a -> Bool) -> [a] -> Maybe a
Run Code Online (Sandbox Code Playgroud)
在没有揭示find定义的情况下,我们可以尝试在ghci中使用它.首先,我们需要导入,Data.List因为它是定义的地方.
> import Data.List
Run Code Online (Sandbox Code Playgroud)
第一个find说它需要一个带有类型的函数a -> Bool.要传递一个参数,find我们将整个函数传递给它.我们不需要先调用该函数,或者给出该函数参数,我们可以将该函数视为普通值并将整个函数传递给find.当我们谈论语言的"作为一等公民的功能"时,这种将功能视为普通价值的能力就是这样的意思; 我们可以对所有其他类型的函数执行任何操作.要传递一些内容,我们需要先定义它.
> let divisibleBy3 x = x `mod` 3 == 0
Run Code Online (Sandbox Code Playgroud)
现在,我们将整个divisibleBy3函数find作为其第一个参数传递.作为第二个参数,我们将传递一个包含我们想要找到的内容的列表,[4, 7, 9, 10]
> find divisibleBy3 [4, 7, 9, 10]
Just 9
Run Code Online (Sandbox Code Playgroud)
Haskell提供了其他方法来定义一个简单引用已经定义的函数的函数.lambda构造一个新的匿名函数.如果构造的函数具有正确的类型,我们可以将它作为第一个参数传递给find.
> find (\x -> x*3 == x + 8) [1,2,3,4,5,6,7,8,9,10]
Just 4
Run Code Online (Sandbox Code Playgroud)
函数类型既可以作为函数的参数出现,也可以作为函数的结果出现.这意味着我们可以创建创建新功能的函数.我们可以编写函数组合运算符.,作为普通的函数声明.为此,我们首先需要隐藏前奏中的定义.
> import Prelude hiding ((.))
> let f . g = \x -> f (g (x))
Run Code Online (Sandbox Code Playgroud)
在右侧用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
Run Code Online (Sandbox Code Playgroud)
当我们定义一个像
same :: Int -> Int -> Bool
same x y = x - y == 0
Run Code Online (Sandbox Code Playgroud)
类型->中的函数类型构造函数same是右关联的,这意味着右边的东西在左边的东西之前被组合在一起.
same :: Int -> (Int -> Bool)
Run Code Online (Sandbox Code Playgroud)
通过添加这些括号,我们可以看到same,看起来像两个参数的函数,可以被视为只有一个参数Int的函数,它返回一个函数,Int -> Bool.我们可以使用部分应用的函数来生成作为参数传递的函数.
> let same x y = x - y == 0
> find (same 7) [1..10]
Just 7
Run Code Online (Sandbox Code Playgroud)