2013-01-07 128 views
1

我声明一些数据类型如下:数据类型哈斯克尔错误

 
data TX_OR_TY = TX | TY 
data TX = X Int 
data TY = Y Float 

现在我写的一些函数返回它们的数据类型:

 
funcTX :: TX 
funcTX = X 3 

funcTY :: TY 
funcTY = Y 5 

ordFuncTX :: TX -> Int -> Bool 
ordFuncTX (X a) b = (a > b) 

funcTX_TY :: TX_OR_TY 
funcTX_TY = if (ordFuncTX funcTX 4) then funcTX else funcTY 

功能funcTX_TY将通过比较返回类型TX_OR_TY的TX值为4,如果大于则返回TX,如果小于则返回TY。但编译时,它宣布它不能匹配预期类型TX_OR_TYTX。我该如何解决?

回答

5

您的数据声明可能不是您想要的。

TX_OR_TY只是定义了两个构造函数:TX和TY。

以下数据声明定义了类型 TX和TY。

你可能是指像

data TX_OR_TY = AnX TX | AnY TY 
data TX = X Int 
data TY = Y Float 
-- Now I write some function return their data type: 

funcTX :: TX 
funcTX = X 3 

funcTY :: TY 
funcTY = Y 5 

ordFuncTX :: TX -> Int -> Bool 
ordFuncTX (X a) b = (a > b) 

funcTX_TY :: TX_OR_TY 
funcTX_TY = if (ordFuncTX funcTX 4) then AnX funcTX else AnX funcTY 

注意TX_OR_TY是从标准前奏Either数据类型的专用版本。要使用Either,请省略TX_OR_TY的定义并更改以下函数:

funcTX_TY :: Either TX TY 
funcTX_TY = if (ordFuncTX funcTX 4) then Left funcTX else Right funcTY 
+0

如果我声明像数据TX_OR_TY = X Int | Y Float。一切都会安好的。但是有时TX和TY我想单独声明它们以防TX和TY是一个非常复杂的类型,我不想在一行中声明 – chipbk10

+0

@ chipbk10单独声明它们是可以的,我的示例仍然使用您的定义的TX和TY类型。 – Chris

+0

数据TX_OR_TY = TX TX | TY TY --->这是什么意思?这让我更加困惑。 – chipbk10