Fractional类型搭配Maybe时x/y运算的类型错误问题排查
问题分析
你写的代码里x / y的类型不匹配问题来自两个层面:
/是Fractional类型类的成员方法,要求左右两个操作数必须是同一种Fractional类型,且运算返回值也和操作数类型一致。但你的参数x、y都是Integral类型类的实例,不属于Fractional范畴,根本不能直接作为/的入参使用。- 就算你要得到符合签名里
Fractional b约束的返回值,也需要先把Integral类型的x、y转换为Fractional类型,再做除法运算。
修正方案
用标准库的fromIntegral函数把两个入参先转为Fractional类型即可,修改后的代码如下:
my :: (Integral a, Fractional b) => a -> a -> Maybe b my x y | y == 0 = Nothing | otherwise = Just ( fromIntegral x / fromIntegral y )
fromIntegral的作用是把任意Integral类型的数值转为任意Num类型(而Fractional是Num的子类,所以可以直接转成我们需要的b类型),转换后两个操作数都满足Fractional的约束,就可以正常用/运算了。
内容的提问来源于stack exchange,提问作者Zegrep -
相关产品推荐
相关产品推荐

