Haskell输入多个数字->;输出多个数字+;分

Haskell输入多个数字->;输出多个数字+;分,haskell,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

我想得到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.
问题是我尝试执行的多重输出或除法…

(/)
具有以下类型:

(/) :: Fractional a => a -> a -> a
整数
不是
分数
的实例。毕竟,将整数除以整数的结果可能不是整数(例如
3/2

您想使用
div

div :: Integral a => a -> a -> a
这是因为
Integer
Integral
的一个实例(使用
:info Integer
进行检查)。您可以使用中缀符号来保持清楚:

(a + b) `div` 2

根据Zeta的回答(以及您在评论中的问题),您可以使代码返回双倍而不是整数(从而涵盖除数不完全进入分子的情况)

例如:

t :: Int -> Int -> Int -> (Double, Double, Double)
t a b c = (fromIntegral (a+b) /2, fromIntegral (a+b+c)/3, fromIntegral (b+c)/2)
从Int到Double的转换使用fromIntegral(或者通常是从非分数的东西到分数的东西)对于开始Haskell的人来说是一个常见的问题

请注意
fromIntegral
的类型是如何
fromIntegral::(Integral a,Num b)=>a->b
,因为它接受整数(如整数)并将其转换为小数(如双精度)

像Java中那样通过强制转换是不可能做到这一点的。java代码:

int x = 1;
foo((double) x);
哈斯凯尔会是:

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

非常感谢泽塔。最后一行解决了我的问题。但是为了更好地理解div::Integral a=>a->a->我如何在代码中使用div::或::fractal使其工作?再次感谢您的回答。:)在程序的逻辑中,您并没有真正“使用”div::“或”::小数”。简单地说,每当你看到像NAME::a->b->c这样的东西时,它的意思是“调用NAME的函数,获取'a'类型的东西,然后获取'b'类型的东西,并返回'c'类型的东西”,或者更通俗地说,NAME的类型是a->b->c。现在,当你在图片中添加类似“积分a=>”的内容时,它只是意味着“a不一定是一个特定的类型,但它的行为必须像一个整数”。@STUDENT\u LIFE:事实上,我不太明白你的评论问题。也许你说的是
t::(积分a)->a->a->a->(a,a)