gpt4 book ai didi

haskell - 我怎么能理解 "(.) . (.)"?

转载 作者:行者123 更新时间:2023-12-03 08:36:06 25 4
gpt4 key购买 nike

我相信我明白fmap . fmap对于 Functors,但在功能上,它已经让我头疼好几个月了。

我已经看到您可以应用 (.) 的定义至(.) . (.) ,但我忘记了如何做到这一点。
当我自己尝试时,结果总是错误的:

(.) f g = \x -> f (g x)
(.) (.) (.) = \x -> (.) ((.) x)
\x f -> (.) ((.) x) f
\x f y -> (((.)(f y)) x)
\x f y g-> (((.)(f y) g) x)
\x f y g-> ((f (g y)) x)
\x f y g-> ((f (g y)) x):: t2 -> (t1 -> t2 -> t) -> t3 -> (t3 -> t1) -> t

如果“仅应用定义”是唯一的方法,那么有人是如何想出 (.) . (.) 的? ?
我必须缺少一些更深层次的理解或直觉。

最佳答案

提出 (.) . (.)实际上非常简单,这是它所做的事情背后的直觉,很难理解。
(.)在将表达式重写为“管道”样式计算时(想想 shell 中的 |),可以让你走得很远。但是,一旦您尝试将一个接受多个参数的函数与一个只接受一个参数的函数组合在一起,使用起来就会变得很尴尬。例如,让我们定义 concatMap :

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

摆脱 xs只是一个标准操作:
concatMap f = concat . map f

然而,摆脱 f 没有“好”的方法。 .这是因为 map接受两个参数,我们想申请 concat关于它的最终结果。

您当然可以应用一些无积分的技巧,只需 (.) :
concatMap f = (.) concat (map f)
concatMap f = (.) concat . map $ f
concatMap = (.) concat . map
concatMap = (concat .) . map

但是很可惜,这段代码的可读性几乎没有了。相反,我们引入了一个新的组合器,它完全符合我们的需要:将第二个函数应用于第一个函数的最终结果。
-- .: is fairly standard name for this combinator
(.:) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
(f .: g) x y = f (g x y)

concatMap = concat .: map

好吧,这就是动力。让我们开始点免费业务。
(.:) = \f g x y -> f (g x y)
= \f g x y -> f ((g x) y)
= \f g x y -> f . g x $ y
= \f g x -> f . g x

现在,有趣的部分来了。这是另一个在您遇到困难时通常会有所帮助的无点技巧:我们重写 .进入其前缀形式并尝试从那里继续。
     = \f g x   -> (.) f (g x)
= \f g x -> (.) f . g $ x
= \f g -> (.) f . g
= \f g -> (.) ((.) f) g
= \f -> (.) ((.) f)
= \f -> (.) . (.) $ f
= (.) . (.)

至于直觉,有这个 very nice article你应该阅读。我将解释关于 (.) 的部分。 :

让我们再想想我们的组合器应该做什么:它应该应用 fg 的结果(我之前一直在故意使用最终结果,这就是你完全应用时得到的结果 - 将类型变量与另一个函数类型模统一 - g 函数,这里的结果只是应用程序 g x 对于某些 x)。

申请 f对我们意味着什么结果 g ?好吧,一旦我们申请 g到某个值,我们将获取结果并应用 f给它。听起来很熟悉:就是这样 (.)做。
result :: (b -> c) -> ((a -> b) -> (a -> c))
result = (.)

现在,事实证明这些组合器的组合(我们的单词)只是一个函数组合,即:
(.:) = result . result -- the result of result

关于haskell - 我怎么能理解 "(.) . (.)"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15029843/

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