2013-01-07 66 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