我想用一个常量和一些简单的操作派生一个类:
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
的策略,但不是。
答案 0 :(得分:3)
GeneralizedNewtypeDeriving
将编写您建议的实例,但DeriveAnyClass
将编写此实例:
instance Zeros Text => Zeros Basis1
N.B。没有方法定义!为此,您需要为每个方法提供默认实现;通常这是使用generics或类似的通用编程工具包完成的。
答案 1 :(得分:2)
你指出Ryan的博客文章解释了修复。为什么不使用它?添加DerivingStrategies
,然后使用deriving newtype Zeros
。