【发布时间】:2021-12-10 09:16:48
【问题描述】:
此代码使用 Int-> [Int] 类型签名,但我必须使用 Integer -> [Int] 类型签名解决它。我必须进行哪些更改才能使其正常工作?
toBin :: Int -> [Int]
toBin n
| n == 0 = []
toBin n = [n `mod` 2] ++ toBin (n `div` 2)
【问题讨论】:
此代码使用 Int-> [Int] 类型签名,但我必须使用 Integer -> [Int] 类型签名解决它。我必须进行哪些更改才能使其正常工作?
toBin :: Int -> [Int]
toBin n
| n == 0 = []
toBin n = [n `mod` 2] ++ toBin (n `div` 2)
【问题讨论】:
您可以使用fromIntegral :: (Integral a, Num b) => a -> b 将Integer(或任何Integral 类型)转换为Int(或任何Num 类型):
toBin :: Integer -> [Int]
toBin 0 = []
toBin n = [fromIntegral (n `mod` 2)] ++ toBin (n `div` 2)
如果n 是Integer,那么n `mod` `2 也是Integer。我们不能使用n `mod` 2 作为列表的元素,因为返回类型是[Int],所以是Ints 的列表。因此,我们需要将Integer 转换为Int 以使元素的类型正确,并且我们可以将Integer 转换为相应的Int(假设Integer 可以用@ 表示987654340@) 和fromIntegral。
【讨论】: