在 haskell 中,如何从十进制数中生成二进制数字?
Posted
技术标签:
【中文标题】在 haskell 中,如何从十进制数中生成二进制数字?【英文标题】:In haskell how can I make binary digits from a decimal number? 【发布时间】:2021-12-09 23:32:26 【问题描述】:实现Bin函数,倒序返回一个非负整数的二进制数!
例子:
Bin 0 == [] Bin 1 == [1] Bin 2 == [0,1] Bin 10 == [0, 1, 0, 1]Bin :: Integer -> [Int]
Bin 0 = []
Bin a `div` 2 = b
Bin a `mod` 2 = c
我想将我的除法结果返回给 Bin 函数并再次对其进行修改等等。 我该如何解决这个问题?我能得到一些帮助吗?
【问题讨论】:
函数都是小写的,所以bin
而不是Bin
。
你希望Bin a `div` 2 = b
做什么?
【参考方案1】:
只有一个参数,所以bin
的实现如下:
bin :: Integer -> [Int]
bin 0 = []
bin n = …
我们可以用divMod :: Integral a => a -> a -> (a, a)
确定模数并将数字除以2,我们可以使用where
子句设置变量d
和m
:
bin :: Integer -> [Int]
bin 0 = []
bin n = …
where (d, m) = divMod n 2
我们不能直接使用m
,因为这是Integer
,而不是Int
,我们可以使用fromIntegral :: (Integral a, Num b) => a -> b
将Integer
转换为Int
。
因此,我们需要构造一个以m
作为该列表元素的列表,并使用递归来确定列表中的其他项目。因此,…
部分应该构造这样的列表。我把它留作练习。提示:您可以使用x
作为第一项,将xs
作为剩余项目的列表,使用(x:xs)
。
【讨论】:
像这样: Bin n = (x:m:xs) = x : Bin m xs ?我将 m 添加到列表中,我想归还 m 和剩余的列表。这是正确的还是我必须做点什么? @hello16:(x:m:xs)
在这里做什么?
它们只是列表中的项目。
@hello16: 那么(x : bin m xs)
是什么?定义每个子句只能包含 一个 =
。
哦,所以我只能用一个=。比 bin n = bin m xs 。我想用这个来回馈 m 和列表的其余部分。我需要归还 m 还是只需要归还 xs?以上是关于在 haskell 中,如何从十进制数中生成二进制数字?的主要内容,如果未能解决你的问题,请参考以下文章