gpt4 book ai didi

haskell - Haskell 示例中的函数组合

转载 作者:行者123 更新时间:2023-12-01 12:18:34 25 4
gpt4 key购买 nike

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

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

我知道上面每个函数的作用,但我看不出结果是如何组合的。我将如何着手弄清楚这条线上的函数运行的顺序,以及哪些参数?

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

但是内部 map 的参数是什么?内部 map 似乎只有一个参数: (\a -> ((head a), (length a))) 。团体 。排序)。第二个参数在哪里(要应用的列表,按元素,第一个参数中的函数)?

最佳答案

你注意到的是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函数的类型是

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

这很好。我们已经将 map 作为第一个参数,现在,它所需要的只是一个合适的列表。 map 刚刚发生的事情称为currying .

现在让我们看看,我们的 map 通过 (.)“连接”到 sortgroup > 功能。

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

现在让我们稍微更改一下您的代码,以便我们可以更好地了解码合函数的情况。

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

我只是用括号将 groupsort 分开。但是现在我们清楚地看到哪些元素作为外部 (.) 的参数。

我们有问题中的 map ,还有另一个函数,它来自另一个组合。当我们省略最后一个参数时,我们又一次执行了柯里化(Currying):

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

最后,外部 map 从上面获取函数和一个列表 (transpose b)

关于haskell - Haskell 示例中的函数组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46326244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com