gpt4 book ai didi

Haskell:join 是如何自然转变的?

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

我可以将 Haskell 中的自然转换定义为:

h :: [a] -> Maybe a
h [] = Nothing
h (x:_) = Just x

并带有函数 k:
k :: Char -> Int
k = ord

由于以下事实,满足自然条件:
h . fmap k == fmap k . h
List monad的 join的自然条件可以吗?以类似的方式演示功能?我无法理解 join ,比如说 concat尤其是一种自然的转变。

最佳答案

好,我们来看看concat .

首先,这是实现:

concat :: [[a]] -> [a]
concat = foldr (++) []

这与您的 h 的结构相似。在哪里 Maybe替换为 []更重要的是, []替换为--暂时滥用语法-- [[]] .
[[]]当然,它也是一个仿函数,但它不是 Functor以自然条件使用它的方式为例。直接翻译你的例子是行不通的:
concat . fmap k =/= fmap k . concat
...因为两者 fmap s 只在最外面的 [] 上工作.

虽然 [[]]假设是 Functor 的有效实例出于可能显而易见的实际原因,您不能直接将其设为一个。

但是,您可以这样重建正确的提升:
concat . (fmap . fmap) k == fmap k . concat
...在哪里 fmap . fmap相当于 fmap 的实现假设 Functor [[]] 的实例.

作为相关的附录, return由于相反的原因很尴尬: a -> f a是从省略的恒等仿函数的自然转换。使用 : []身份将这样写:
(:[]) . ($) k == fmap k . (:[])
...完全多余的地方 ($)代表 fmap在省略的恒等仿函数上。

关于Haskell:join 是如何自然转变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5931006/

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