【问题标题】:How to derive Additive generically on Haskell, without defining an Applicative instance?如何在 Haskell 上一般派生 Additive,而不定义 Applicative 实例?
【发布时间】:2015-04-22 04:08:11
【问题描述】:

给定一个类型,只有一种明显的方法可以实现 Additive 实例,从线性库到它。方便的是,Additive 有一个通用实现,所以我们可以使用deriving。不幸的是,这取决于一个Applicative 实例的存在,它是不可推导的,所以你仍然必须声明它:

{-# LANGUAGE DeriveGeneric, DeriveFunctor #-}

import Linear
import GHC.Generics
import Control.Applicative

data Foo a = Foo a a a deriving (Show, Functor, Generic1)

instance Additive Foo

instance Applicative Foo where
    pure x = Foo x x x
    Foo f g h <*> Foo x y z = Foo (f x) (g y) (h z)

main = print $ Foo 1 2 3 ^+^ Foo 4 5 6

有什么方法可以自动派生 Additive,而无需声明 Applicative 实例?

【问题讨论】:

    标签: haskell generic-programming haskell-linear


    【解决方案1】:

    没有。

    具有两个完美组合Applicative 实例的数据类型的典型示例是[] / ZipList。这证明了[]Applicative 的泛型派生需要以某种方式选择其中一个,而实际上这两个选择都不比另一个更有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      相关资源
      最近更新 更多