Haskell输入多个数字 - >输出多个数字+除法

时间:2013-11-06 09:58:42

标签: haskell

我希望将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.

问题是多重输出或我试图做的分歧......

2 个答案:

答案 0 :(得分:5)

(/)具有以下类型:

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

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

您想使用div

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

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

(a + b) `div` 2

答案 1 :(得分:3)

继Zeta的回答(以及你在评论中的问题)之后,你可以让你的代码返回双打而不是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,因为它需要一些Integral(即一个像int这样的整数)并将其转换为小数(如Double)。

不可能像在Java中那样通过强制转换来实现。 java代码:

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

将在Haskell中:

let x :: Int ; x = 1 in foo $ fromIntegral x