混淆 ghci 中的类型
Confusing types in ghci
这是我的代码:
n = [(a,b) | a <- [1..5],b <- [1..5]]
calcBmis xs = [bmi | (w, h) <- xs,let bmi = w / h ^ 2]
尝试将 calcBmis
应用于 n
时,出现以下错误:
*Charana> calcBmis n
<interactive>:220:1:
No instance for (Fractional Integer)
arising from a use of ‘calcBmis’
In the expression: calcBmis n
In an equation for ‘it’: it = calcBmis n
在 ghci 中进一步调查:
*Charana> :t calcBmis
calcBmis :: Fractional t => [(t, t)] -> [t]
*Charana> :t n
n :: [(Integer, Integer)]
我假设我生成的列表是 (Integer,Integer)
类型的,但不能在 calcBmis
中处理,它只接受 Fractional
。知道如何解决这个问题吗?
您可以使用 div
而不是 (/)
:
calcBmis xs = [ bmi | (w,h) <- xs, let bmi = (w `div` h)^2 ]
Prelude> :t calcBmis
calcBmis :: Integral t => [(t, t)] -> [t]
Prelude> calcBmis n
[1,0,0,0,0,4,1,0,0,0,9,1,1,0,0,16,4,1,1,0,25,4,1,1,1]
如您所见,此版本可以处理所有 Integral
值 - 但当然会截断(因为 div
)。
或者您可以使用 fromIntegral
:
映射所有内容
calcBmis xs = [ bmi | (w,h) <- xs, let bmi = (fromIntegral w / fromIntegral h)^2 ]
Prelude> :t calcBmis
calcBmis:: (Fractional t, Integral t1, Integral t2) => [(t1, t2)] -> [t]
这将产生分数值:
Prelude> calcBmis n
[1.0,0.25,0.1111111111111111
,6.25e-2
,4.000000000000001e-2
,4.0
,1.0
,0.4444444444444444
, ... ]
在任何一种情况下,只要它们是 Integral
的实例,它都将适用于所有输入 - 第二个版本甚至会接受成对的不同积分;)
这是我的代码:
n = [(a,b) | a <- [1..5],b <- [1..5]]
calcBmis xs = [bmi | (w, h) <- xs,let bmi = w / h ^ 2]
尝试将 calcBmis
应用于 n
时,出现以下错误:
*Charana> calcBmis n
<interactive>:220:1:
No instance for (Fractional Integer)
arising from a use of ‘calcBmis’
In the expression: calcBmis n
In an equation for ‘it’: it = calcBmis n
在 ghci 中进一步调查:
*Charana> :t calcBmis
calcBmis :: Fractional t => [(t, t)] -> [t]
*Charana> :t n
n :: [(Integer, Integer)]
我假设我生成的列表是 (Integer,Integer)
类型的,但不能在 calcBmis
中处理,它只接受 Fractional
。知道如何解决这个问题吗?
您可以使用 div
而不是 (/)
:
calcBmis xs = [ bmi | (w,h) <- xs, let bmi = (w `div` h)^2 ]
Prelude> :t calcBmis
calcBmis :: Integral t => [(t, t)] -> [t]
Prelude> calcBmis n
[1,0,0,0,0,4,1,0,0,0,9,1,1,0,0,16,4,1,1,0,25,4,1,1,1]
如您所见,此版本可以处理所有 Integral
值 - 但当然会截断(因为 div
)。
或者您可以使用 fromIntegral
:
calcBmis xs = [ bmi | (w,h) <- xs, let bmi = (fromIntegral w / fromIntegral h)^2 ]
Prelude> :t calcBmis
calcBmis:: (Fractional t, Integral t1, Integral t2) => [(t1, t2)] -> [t]
这将产生分数值:
Prelude> calcBmis n
[1.0,0.25,0.1111111111111111
,6.25e-2
,4.000000000000001e-2
,4.0
,1.0
,0.4444444444444444
, ... ]
在任何一种情况下,只要它们是 Integral
的实例,它都将适用于所有输入 - 第二个版本甚至会接受成对的不同积分;)