Haskell 使用newtype自动派生实例
(有关问题) 我喜欢包装类型Haskell 使用newtype自动派生实例,haskell,Haskell,(有关问题) 我喜欢包装类型 {-# LANGUAGE GeneralizedNewtypeDeriving #-} newtype Foo = Foo { unFoo :: Int } deriving (Eq, Ord, Enum, Real, Num, Read, Integral, Show) newtype Var = Var { unVar :: Int } deriving (Eq, Ord, Enum, Real, Num, Read, Integral, Show) 阻止 d
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype Foo = Foo { unFoo :: Int } deriving (Eq, Ord, Enum, Real, Num, Read, Integral, Show)
newtype Var = Var { unVar :: Int } deriving (Eq, Ord, Enum, Real, Num, Read, Integral, Show)
阻止
doSomething :: Int -> Int -> Int
doSomething someFoo otherVar
是否可以自动派生所有可能的实例?
(不推荐?有更好的方法吗?)
谢谢大家! 嗯,使用template haskell可能是可行的,但实际上,如果要派生所有可能的实例,最好只使用
类型
别名。如果数据类型纯粹是软件内部的。。。只要根据需要添加到派生(…)
子句。@bheklillr我认为type
不能防止混合类型@rampion,是的,但有点烦人(真的不多)。@josejuan如果你的Foo
在各个方面都与Int
相同,只是它被包装在一个额外的构造函数中,那么为什么你需要Foo
分开呢?你从这种区别中得到了什么?如果需要控制哪些值对Foo
有效,则使用智能构造函数并手动定义Num
实例。否则用户将不知道doSomething 1 2
和doSomething(Foo 1)(Foo 2)
之间的任何区别,他们的行为将是相同的。@bheklir成年人和儿童都是平等的,除了一个是成年人和另一个是儿童。但是我不喜欢混合processBook儿童成人
(什么时候是processBook成人儿童
)。