Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用newtype自动派生实例_Haskell - Fatal编程技术网

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成人儿童
)。