我希望将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.
问题是多重输出或我试图做的分歧......
答案 0 :(得分: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
答案 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