1

次のようにいくつかのデータ型を宣言します。

データ TX_OR_TY = TX | タイ
データ TX = X Int
データ TY = Y Float

ここで、データ型を返す関数をいくつか書きます。

関数TX :: TX
関数TX = X 3

関数TY::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の 2 つのコンストラクターを定義するだけです。

次のデータ宣言は、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 は、標準プレリュードからの Both データ型の特殊化されたバージョンであることに注意してください。Both を使用するには、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 に答える