如何实现遍历使用foldMap

Chi*_*ing 2 haskell typeclass

foldMap可以通过遍历实现:

foldMap f = getConst . traverse (Const . f)
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是如何通过foldMap实现遍历:

traverse f = ...
Run Code Online (Sandbox Code Playgroud)

要么

it Can't be accomplished ?
Run Code Online (Sandbox Code Playgroud)

Dan*_*ner 5

有些Foldable情况无法完成.

data Blonk a = Blink | Blank

instance Functor Blonk where
    fmap f Blink = Blink
    fmap f Blank = Blank

instance Foldable Blonk where
    foldMap f _ = mempty
Run Code Online (Sandbox Code Playgroud)

以上是唯一可能的总,守法的实现FunctorFoldableBlonk.现在有一条法律Traversable:

traverse Identity = Identity
Run Code Online (Sandbox Code Playgroud)

让我们看看它是如何发挥作用的,假设是以某些术语traverse来实现的foldMap,也就是说,有一些术语gh(f如果他们喜欢的话可能会提到):

traverse f = g . foldMap h
Run Code Online (Sandbox Code Playgroud)

然后:

traverse f x = g (foldMap h x)
             = g mempty
-- THEREFORE
traverse Identity x = g mempty
Run Code Online (Sandbox Code Playgroud)

注意,g mempty不依赖于x,因此必须是Identity BlinkIdentity Blank适合该类型.在前一种情况下,

traverse Identity Blank = Identity Blink
                       != Identity Blank
Run Code Online (Sandbox Code Playgroud)

并违反了法律.同样traverse Identity Blink是证人在另一案件中违反了法律.

(并且,为了证明我没有任何打击,有一个守法的Traversable例子:

instance Traversable Blonk where
    traverse f Blink = pure Blink
    traverse f Blank = pure Blank
Run Code Online (Sandbox Code Playgroud)

)

  • 由于语义饱和,"眨眼"现在对我来说似乎是一种声音效果,而不是合法的英语单词. (2认同)