0

入力として3つの数値を取得し、出力として複数の結果を出したいです。

私のコード:

t :: Integer -> Integer -> Integer -> (Integer,Integer,Integer)
t a b c = ((a+b)/2,(a+b+c)/3,(b+c)/2)

しかし、ここで問題があるようです:

Lab2.hs:17:17:
No instance for (Fractional Integer) arising from a use of `/'
Possible fix: add an instance declaration for (Fractional Integer)
In the expression: (a + b) / 2
In the expression: ((a + b) / 2, (a + b + c) / 3, (b + c) / 2)
In an equation for `t':
    t a b c = ((a + b) / 2, (a + b + c) / 3, (b + c) / 2)
Failed, modules loaded: none.

問題は、複数の出力または私がやろうとしている除算です...

4

2 に答える 2

3

Zeta の回答 (およびコメントでの質問) に続いて、コードが Int ではなく Double を返すようにすることができます (したがって、除数が正確に分子に入らない場合をカバーします)。

例えば:

t :: Int -> Int -> Int -> (Double, Double, Double)
t a b c = (fromIntegral (a+b) /2, fromIntegral (a+b+c)/3, fromIntegral (b+c)/2)

fromIntegral を使用した Int から Double への変換 (または一般的に Fractional ではないものから Fractional である何かへの変換) は、Haskell を始めた人にとってよくある落とし穴です!

fromIntegralの型がであることに注意してくださいfromIntegral :: (Integral a, Num b) => a -> b。これは、Integral (つまり、int のような整数) を受け取り、それを分数 (Double のような) に変換するという点です。

Java のようにキャストを介してこれを行うことはできません。Java コード:

int x = 1;
foo((double) x);

Haskell では次のようになります。

let x :: Int ; x = 1 in foo $ fromIntegral x
于 2013-11-06T10:44:53.660 に答える