gpt4 book ai didi

haskell - typeclass bimap怎么没有循环定义

转载 作者:行者123 更新时间:2023-12-05 01:49:19 28 4
gpt4 key购买 nike

我缺少什么关键的直觉来理解这段代码?我不明白这些是怎么组成的。首先需要一个函数 (a->c) 和构造类型 (f a b)。然而,第二个产量(f a d)。此外,first 和 second 是根据 bimap 定义的,看起来是圆形的。

class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
bimap g h = first g . second h
first :: (a -> c) -> f a b -> f c b
first g = bimap g id
second :: (b -> d) -> f a b -> f a d
second = bimap id

最佳答案

secondcurried .您可以编写隐含参数,它将与 first 对称。

first g = bimap g id
second g = bimap id g

关于定义是否循环的问题,答案是肯定的。它们是圆形的。根据严格阅读 Haskell 标准,以下实现是正确的

data F a b = F a b

instance Bifunctor F -- No functions implemented; take all three defaults

这将根据 Haskell 标准进行编译。但是任何调用 firstsecondbimap 的尝试都会触底,因为它们将永远相互调用。

但是,如果您查看 source code对于 Bifunctor,还有另一个小注释。

{-# MINIMAL bimap | first, second #-}

这不是一般的评论。这是一条针对 GHC(最流行的 Haskell 编译器)的特殊指令。 GHC 特别支持最小指令。这声明 Bifunctor 的实例只有在实现至少 bimapfirst 时才完整>第二个。因此,在 GHC 上,如果您在自己的 instance 中无法满足该条件,则会出现编译器错误。这也反射(reflect)在 the Hackage docs 中。

Minimal complete definition

bimap | first, second

期望的是,作为程序员,您可以覆盖其中一些默认值,而其余的默认值可以默默地就位。

您可以在内置类型类 Eq 中更直接地看到相同的行为

class  Eq a  where
(==), (/=) :: a -> a -> Bool

{-# INLINE (/=) #-}
{-# INLINE (==) #-}
x /= y = not (x == y)
x == y = not (x /= y)
{-# MINIMAL (==) | (/=) #-}

(==)(/=) 都是相互实现的,最下面有一个MINIMAL 指令表明任何实例必须至少实现这两个功能之一。

关于haskell - typeclass bimap怎么没有循环定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74238795/

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