带haskell的整数到二进制

带haskell的整数到二进制,haskell,functional-programming,binary,Haskell,Functional Programming,Binary,这个函数有问题,我需要它给出一个数字的二进制形式,作为4个元素的列表(从0到15) 例如,对于输入0,它应该给我[0,0,0,0],3:[0,0,1,1],15[1,1,1] 我就是这么做的 bin 0 x = [] bin n x = (mod x 2) : (bin (n-1) (div x 2)) 它向后给出结果 这是: bin 0 x = [] bin n x = (bin (n-1) (div x 2)) ++ (mod x 2) 不工作,编译时不会显示错误,但当我输入例如bin

这个函数有问题,我需要它给出一个数字的二进制形式,作为4个元素的列表(从0到15) 例如,对于输入0,它应该给我[0,0,0,0],3:[0,0,1,1],15[1,1,1] 我就是这么做的

bin 0 x = []
bin n x = (mod x 2) : (bin (n-1) (div x 2))
它向后给出结果 这是:

bin 0 x = []
bin n x =  (bin (n-1) (div x 2)) ++ (mod x 2)
不工作,编译时不会显示错误,但当我输入例如
bin 4 1
时会显示:

"No instance fo ( Integral [t0]) arising from a use of 'it'
In a stmt of an interactive GHCi command : print it "

我不知道该怎么办,任何帮助都将不胜感激

++
包含两个列表,
mod x 2
不是一个列表。你可以用

... ++ [mod x 2]
但是,请注意,重复在列表末尾添加这样的元素是低效的,会导致二次复杂性


最好使用第一个代码段向后生成位,然后使用
reverse
在结尾处按向前方向重新排列位。这将提供线性复杂性。

++
包含两个列表,而
mod x 2
不是一个列表。你可以用

... ++ [mod x 2]
但是,请注意,重复在列表末尾添加这样的元素是低效的,会导致二次复杂性


最好使用第一个代码段向后生成位,然后使用
reverse
在结尾处按向前方向重新排列位。这将提供线性复杂度。

尝试为函数添加类型签名-这会增加错误消息的帮助性-还可以考虑什么是
mod x 2
,如果与
(++)
一起使用,它应该是什么(提示尝试使用这些方括号)谢谢@epsilonhalbe我现在意识到在2个liststry之间使用++为您的函数添加类型签名-这增加了错误消息的帮助性-还要考虑什么是
mod x 2
,如果您将它与
(++)
一起使用,它应该是什么(提示尝试使用那些方括号)谢谢@epsilonhalbe我现在意识到++在两个列表之间使用