我想向下转换类型(从C到A),但在示例中失败了:
data A = One Int
data B = Two Int
fa::A -> Int
fa a = 1
data C = A | B
f::C -> Int
f c = case c of
A -> fa (c::A)
_ -> 0
Run Code Online (Sandbox Code Playgroud)
错误消息是:
Couldn't match expected type ‘A’ with actual type ‘C’
In the first argument of ‘fa’, namely ‘(c :: A)’
In the expression: fa (c :: A)
Run Code Online (Sandbox Code Playgroud)
我怎么能正确地做到这一点?非常感谢!
它看起来像你混淆的数据类型A与构造A的数据类型C.在c您传递到功能f已键入C,这意味着它是与任一构造的构造的值A或B.然而,类型的值A和类型B被构造与所述构造One和Two分别.
也许你想要的是这样的东西:
data A = One Int
data B = Two Int
fa :: A -> Int
fa a = 1
data C = A A | B B
f :: C -> Int
f c = case c of
A a -> fa a
_ -> 0
Run Code Online (Sandbox Code Playgroud)
关键的区别在于C类型现在包含一个由构造函数构造的值,该A构造函数包含一个type值,A或者由一个包含值type 的B构造函数构造的值B.当然,你应该把你的构造函数命名为不那么令人困惑的东西data C = TheA A | TheB B.或者,您可以使用与Either您同构的类型C:type C = Either A B.