1

我声明一些数据类型如下:

数据 TX_OR_TY = TX | 泰
数据 TX = X Int
数据 TY = Y 浮点数

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

函数TX :: TX
函数TX = X 3

功能 :: TY
功能 = 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 的值与 4 进行比较,返回一个 TX_OR_TY 类型,如果较大则返回 TX,如果较小则返回 TY。但是在编译时,它宣布它无法将预期的类型TX_OR_TYTX匹配。我该如何解决?

4

1 回答 1

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
于 2013-01-07T02:00:34.720 回答