![](/img/trans.png)
[英]Is it possible to write a generall derived instance for a data type in haskell?
[英]Haskell type with derived value
是否有可能使一种类型的函数预先执行其值之一以生成其值的另一个? 例如:
data Foo=Foo {valueOne::Int, valueTwo=valueOne*2} deriving (Bar)
还是我以错误的方式思考这个问题? 任何帮助表示赞赏!
如果您始终希望第二个字段依赖于第一个字段,则只需编写一个普通函数即可:
data Foo = Foo { valueOne :: Int } deriving (Bar)
valueTwo :: Foo -> Int
valueTwo x = valueOne x * 2
唯一的区别是,自动生成的Bar
实例不会注意到第二个字段。
相反,如果您想生成具有这种约束的值,但有时仍然可以忽略该值,请使用智能构造函数 :
data Foo = Foo { valueOne :: Int, valueTwo :: Int } deriving (Bar)
foo :: Int -> Foo
foo x = Foo x (2 * x)
如果使用foo
而不是Foo
构造新值,则无需传递第二个参数,该参数将从第一个参数派生。
通常,这是一个在使用的module
不出口构造Foo
,但出口智能构造foo
。 这样,模块的用户就可以构建满足不变式的值,而模块中的功能可以在需要时忽略它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.