Haskell如何生成首元素为整数、次元素为浮点数的二元组(tuple)?
问题根源
问题出在Haskell的类型推导规则和/运算符的类型约束上:
/运算符的类型为Fractional a => a -> a -> a,要求两个运算数和返回值都属于Fractional类型类,整数类型不属于这个类型类- 你原来的写法
1 / x会触发类型推导自动把x的类型统一为Fractional(比如Double),所以二元组第一个位置的x也被隐式转换为浮点数了
解决方案
只需要在做除法的位置单独把x转换为Fractional类型即可,用标准库的fromIntegral函数处理参与运算的x,外层作为二元组第一个元素的x可以保留原整数类型:
f2 n = [(x, 1 / fromIntegral x) | x <- [1 .. n]]
你也可以手动加上类型签名让类型更明确,避免后续使用时出现类型歧义:
f2 :: Int -> [(Int, Double)] f2 n = [(x, 1 / fromIntegral x) | x <- [1 .. n]]
测试效果
执行f2 5就能得到你预期的输出:
[(1,1.0),(2,0.5),(3,0.3333333333333333),(4,0.25),(5,0.2)]
内容的提问来源于stack exchange,提问作者Nevermore
相关产品推荐
相关产品推荐

