【发布时间】:2018-03-13 10:12:02
【问题描述】:
我想派生一个具有常量和一些琐碎操作的类:
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的策略导致的,但不是。
【问题讨论】:
-
Haskell 应该如何知道
zero元素应该是什么?但事实上,只有在某些特定情况下,Haskell 才能执行自动推导。 -
您能指出
specific cases的列表吗?与派生(例如,显示)相比,Basis1 的预期派生实例有什么不同?添加了新类型构造函数.. - 在 GHC 中实现为常量派生会很困难吗? -
而且您并没有真正提供一种方法来推导
zero是什么,因此保守的编译器不能简单地做出幸运的猜测。 -
感谢您的耐心等待。我必须错过一些东西:给出了 Text 的一个实例,我假设新类型
Basis1 Text的派生应该自动使用它 - 与show相同。在downloads.haskell.org/~ghc/7.4.2/docs/html/users_guide/… 中提到了派生常量的机制;我应该使用那里描述的机制吗?
标签: haskell