我声明了一些数据类型如下:
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的值与4进行比较来返回TX_OR_TY类型,如果大于则返回TX,如果小则返回TY。但在编译时,它宣布它与 TX TX 的预期类型 TX_OR_TY 无法匹配。我该如何解决?
答案 0 :(得分: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