如何使此代码与 Integer-> Int 类型签名一起使用?
Posted
技术标签:
【中文标题】如何使此代码与 Integer-> Int 类型签名一起使用?【英文标题】:How can I make this code to work with the Integer- > Int type signature? 【发布时间】: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)
【问题讨论】:
【参考方案1】:您可以使用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]
,所以是Int
s 的列表。因此,我们需要将Integer
转换为Int
以使元素的类型正确,并且我们可以将Integer
转换为相应的Int
(假设Integer
可以用@ 表示987654340@) 和fromIntegral
。
【讨论】:
是的,但在这种情况下,绝对应该讨论一下(双关语不是有意)为什么这种转换实际上是合适的以及为什么应该在那个地方进行。以上是关于如何使此代码与 Integer-> Int 类型签名一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
在double,int,long和short类型中,有多少可以填充空白以使此代码输出0? [重复]