派生一个具有单个常量的类

时间:2018-03-13 10:12:02

标签: haskell

我想用一个常量和一些简单的操作派生一个类:

class  Zeros z where
    zero :: z
    isZero  :: Eq z =>  z -> Bool
    isZero z = zero == z

在另一个模块中:

{-# LANGUAGE DeriveGeneric, DeriveAnyClass
    , GeneralizedNewtypeDeriving #-}
module Lib.DerivingExampleDerive
    where
import Data.Text
import Lib.DerivingExample
import GHC.Generics

newtype Basis1 = Basis1 Text deriving (Show, Read, Eq, Ord, Generic, Zeros)

GHC 8.2.2产生错误:

/home/frank/Workspace8/testSome/Lib/DerivingExampleDerive.hs:26:70: warning:
    • Both DeriveAnyClass and GeneralizedNewtypeDeriving are enabled
      Defaulting to the DeriveAnyClass strategy for instantiating Zeros
    • In the newtype declaration for ‘Basis1’
   |         
26 | newtype Basis1 = Basis1 Text deriving (Show, Read, Eq, Ord, Generic, Zeros)
   |                                                                      ^^^^^

/home/frank/Workspace8/testSome/Lib/DerivingExampleDerive.hs:26:70: warning: [-Wmissing-methods]
    • No explicit implementation for
        ‘zero’
    • In the instance declaration for ‘Zeros Basis1’
   |         
26 | newtype Basis1 = Basis1 Text deriving (Show, Read, Eq, Ord, Generic, Zeros)
   |                                                                      ^^^^^

我理解第一条消息(考虑Ryan Scott's blog post on deriving strategies但不是第二条消息。

我应该断定Haskell中的派生机制不能导出常量吗?我已经给了

instance Zeros Text where zero = (""::Text)

的推导
instance Zeros Basis1 where zero = Basis1 zero  

应该来自DeriveAnyClass的策略,但不是。

2 个答案:

答案 0 :(得分:3)

GeneralizedNewtypeDeriving将编写您建议的实例,但DeriveAnyClass将编写此实例:

instance Zeros Text => Zeros Basis1

N.B。没有方法定义!为此,您需要为每个方法提供默认实现;通常这是使用generics或类似的通用编程工具包完成的。

答案 1 :(得分:2)

你指出Ryan的博客文章解释了修复。为什么不使用它?添加DerivingStrategies,然后使用deriving newtype Zeros

相关问题