haskell中用户定义的高阶函数

haskell中用户定义的高阶函数,haskell,Haskell,我看了几个Haskell学习示例,但我不知道如何在Haskell中编写用户定义的高阶函数 如果我们将一个参数作为函数,那么函数id的类型是如何定义的?让我们使用函数映射作为一个简单的例子映射接受一个函数和一个列表,并将该函数应用于列表的所有元素。如果您编写map的签名,它的运行方式如下: map :: (a -> b) -> [a] -> [b] map f [] = [] map f (x:xs) = f x : map f xs 首先,您需要一个函数。任何函数都

我看了几个Haskell学习示例,但我不知道如何在Haskell中编写用户定义的高阶函数


如果我们将一个参数作为函数,那么函数id的类型是如何定义的?

让我们使用函数
映射作为一个简单的例子<代码>映射
接受一个函数和一个列表,并将该函数应用于列表的所有元素。如果您编写
map
的签名,它的运行方式如下:

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs
首先,您需要一个函数。任何函数都可以,因此第一个参数的类型是
a->b
。然后,您需要一个输入值列表。由于列表元素的类型必须适合函数的输入,因此列表的类型为
[a]
。对于输出:当应用于
a
类型的值时,函数
a->b
的结果是什么?对,它是
b
。因此,结果类型是
[b]
。组合在一起,我们的函数类型如下:

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs
定义如下:

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs

这有助于您理解高阶函数的概念吗?

暂时不要关心类型。询问编译器,它会告诉您类型。通过一些练习,您将能够看到几乎与编译器[grin]一样好的类型

这里我们定义了两个非常简单的高阶函数,
两次
组合
。第一个接受一个函数和一个参数,并将其中一个应用于另一个,两次。第二个函数包含两个函数和一个参数,并将这两个函数以链式方式应用于它

$ ghci
GHCi, version 6.12.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> let twice f x = f (f x)
Prelude> :t twice
twice :: (t -> t) -> t -> t
Prelude> let compose f g x = f (g x)
Prelude> :t compose
compose :: (t1 -> t2) -> (t -> t1) -> t -> t2
Prelude> 
您可以看到,
两次
获取两个参数,类型为
(t->t)
类型为
t
,并返回类型为
t
的结果
t
是任何类型(但在所有4次出现中都相同)

您可以尝试在一些常规函数上使用这些高阶函数

Prelude> let times3 x = x * 3
Prelude> let times5 x = x * 5
Prelude> twice times3 2
18
Prelude> twice times5 2
50
Prelude> compose times3 times5 2
30
Prelude> 
这是一些时髦的高级东西:

Prelude> (twice twice) times3 2
162
Prelude> twice (twice times3) 2
162
Prelude> 
您了解最后两个示例中的情况吗?

“作为参数的函数”,而不是“作为函数的参数”,否?