任务:使用Map转换一系列数字,使每个偶数除以2,每个奇数乘以2
prel2 :: (Fractional b) => [Int] -> [b] prel2 x = map prel x where prel y |even y = y/2 |otherwise = y*2
我知道这是一些基本的东西,但我不明白为什么会引发错误
eyh26e7m1#
你的类型签名承诺你可以提供一个任何类型的值列表,只要它有一个Fractional示例,但是,由于y * 总是 * 一个Int(从x :: [Int]开始),那么y*2将总是一个Int,并且y/2根本不会进行类型检查。您 * 可能 * 想要的是使用div而不是/,将Fractional约束替换为Integral约束,然后将您的类型泛化为Integral b => [b] -> [b]。
Fractional
y
Int
x :: [Int]
y*2
y/2
div
/
Integral
Integral b => [b] -> [b]
1条答案
按热度按时间eyh26e7m1#
你的类型签名承诺你可以提供一个任何类型的值列表,只要它有一个
Fractional
示例,但是,由于y
* 总是 * 一个Int
(从x :: [Int]
开始),那么y*2
将总是一个Int
,并且y/2
根本不会进行类型检查。您 * 可能 * 想要的是使用
div
而不是/
,将Fractional
约束替换为Integral
约束,然后将您的类型泛化为Integral b => [b] -> [b]
。