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

5

(/)具有以下类型:

(/) :: Fractional a => a -> a -> a

Integer不是Fractional. 毕竟,整数除以整数的结果可能不是整数(例如3/2)。

你想使用div

div :: Integral a => a -> a -> a

这是有效的,因为Integer它是Integral(使用检查:info Integer)的一个实例。您可以使用中缀表示法来保持清晰:

(a + b) `div` 2
于 2013-11-06T10:04:55.277 回答
3

按照 Zeta 的回答(以及您在评论中的问题),您可以让您的代码返回 Doubles 而不是 Ints(从而涵盖除数不完全进入分子的情况)。

例如:

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 的转换(或者通常从非小数到小数)对于开始 Haskell 的人来说是一个常见的问题!

请注意fromIntegral' 的类型是fromIntegral :: (Integral a, Num b) => a -> b,因为它采用整数(即整数,如 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 回答