繁体   English   中英

Haskell示例中的函数组合

[英]Function composition in Haskell example

假设b是一个字符串列表并考虑,

map (map (\\a -> ((head a), (length a))) . group . sort) (transpose b)

我知道上面的每个函数都做了什么,但我很难看到结果是如何组合的。 我该如何计算出这条线上的函数的运行顺序,以及哪些参数?

具体来说,我似乎明白(map (\\a -> ((head a), (length a))) . group . sort)是外部地图的第一个参数, (transpose b)是第二个参数外部地图。

但是哪个是内部地图的参数? 内部地图似乎只有一个参数: (\\a -> ((head a), (length a))) . group . sort) (\\a -> ((head a), (length a))) . group . sort) (\\a -> ((head a), (length a))) . group . sort) 第二个参数(要应用的列表,元素方式,第一个参数中的函数)在哪里?

您注意到的是currying ,它是Haskell函数的许多优秀(或可能不是)方面之一。 这是你的代码:

map (map (\a -> ((head a), (length a))) . group . sort) (transpose b)

我们来看看第一张map的类型:

map (\a -> ((head a), (length a))) :: [[a]] -> [(a, Int)]

我们这样做是这样做的

:t map (\a -> ((head a), (length a)))

进入ghci

所以知道我们知道这是一个功能。 它采用[[a]]类型的元素并返回[(a, Int)] 给出地图功能的类型是

map :: (a -> b) -> [a] -> [b]

这很好。 我们已经给出了map它的第一个参数,现在,所有它需要它是一个正确的列表。 地图发生的事情叫做currying

现在让我们看看,我们将map “连接”以通过(.)函数进行sortgroup

(.) :: (b -> c) -> (a -> b) -> a -> c

现在让我们改变一下你的代码片段,这样我们就可以更好地看到组合函数发生了什么。

map (\a -> ((head a), (length a))) . (group . sort)

我只是将group分开并用一些括号sort 但现在我们清楚地看到哪些元素充当外部(.)

我们有相关的地图,以及另一个由其他构图产生的功能。 同样,我们在行动钻营 ,当我们离开了最后一个参数:

map (\a -> ((head a), (length a))) . (group . sort)
:: Ord a => [a] -> [(a, Int)]

最后,外部map从上面获取功能和列表(transpose b)

这是隐含的 如果你写:

map (\a -> ((head a), (length a))) . group . sort

这实际上是:

\b -> (map (\a -> ((head a), (length a))) . group . sort) b

这相当于:

\b -> map (\a -> ((head a), (length a))) $ group $ sort b

要么:

\b -> map (\a -> ((head a), (length a))) (group (sort b))

(.) :: (b -> c) -> (a -> b) -> a -> c运算符,因此在某种管道中组合了两个函数:

(.) f g x = f (g x)

因为我们在这里写了三个用点分隔的函数:

   map (\a -> ((head a), (length a))) . group . sort
-- \_________________ ______________/   \_ _/   \_ /
--                   v                    v       v
--                   f                    g       h

我们已经定义了某种管道,其中元素首先通过h处理,然后通过g处理结果,最后通过f处理结果。

点本身就是一个函数,定义如下:

(f . g) x = f (g x)

让我们在外部地图的第一个参数中使用这个等式:

map (\a -> (head a, length a)) . group . sort
= { definition of (.), with map (\a -> ...) as f and group . sort as g }
\x -> map (\a -> (head a, length a)) ((group . sort) x)

所以, map (\\a -> ...) . group . sort map (\\a -> ...) . group . sort map (\\a -> ...) . group . sort是一个函数,当应用于参数x ,将(group . sort) x作为参数提供给map (\\a -> ...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM