2010-10-18 31 views
1

我试图将给定的十进制值转换为其对应的二进制形式。我正在使用Ocaml,对此我不太了解,而且很困惑。到目前为止,我有以下代码Ocaml中从十进制到二进制的转换

let dec_to_bin_helper function 1->'T' | 0->'F' 
let dec_to_bin x = 
      List.fold_left(fun a z -> z mod 2 dec_to_bin_helper a) [] a ;; 

我必须包括在这里,我想我的输出将在T的和F的列表的形式,其中T的代表二进制1和F的代表二进制的0 如果我尝试运行上面的代码,它给了我一个错误,说:“错误:这个表达式不是一个函数;它不能被应用” 我明白,我打电话给辅助函数的部分是错误的...在这件事上的任何帮助会不胜感激!

回答

2

我真的不明白你的第二个功能。您正在折叠一个空列表,并且您的函数采用它从不使用的参数x。我是否正确地假设你想要一个数字并返回一个代表二进制数的'T和'F列表?如果是这样的情况下,该代码应工作:

let dec_to_bin x = 
     let rec d2b y lst = match y with 0 -> lst 
     | _ -> d2b (y/2) ((dec_to_bin_helper (y mod 2))::lst) 
     in 
     d2b x [];; 

此函数插入​​物(在x mod 2)转换成一个T/F到一个列表,然后递归调用X/2和列表中的功能。当x = 0时,返回列表。如果在0上调用它,将返回一个空列表(我不确定这是否是你想要的)。

我认为你遇到的问题是,你正在对列表进行处理,就好像它们是可变的,并且认为fold会突变列表。情况并非如此,fold只是遍历列表中的每个元素并向其应用一个函数。既然你的清单是空的,它什么都不做。

+0

尼基,这正是我想要做的,现在我明白我是如何错误地使用fold_left的。感谢您的解释!但是,为了让事情更清楚,你介绍一下你的嵌套函数“在d2b x [] ;;中使用rec d2b x lst =(* code *)”作品?特别是如果我手工追踪这个问题,“在d2b x [] ;;”工作? – 2010-10-18 17:18:19

+0

啊,当然。 d2b是一个嵌套函数。让rec d2b x =(* code *)在声明函数时,下面的代码在x上调用它(我可能不应该重用相同的变量名,我将编辑它)和一个空列表。我选择这样做的原因是,您可以调用dec_to_bin#并且不必担心列表。 – 2010-10-18 17:34:23

+0

这使得现在很有意义。再次感谢!如果我理解正确的话,那么它意味着来自“dec_to_bin”的“x”被传递为“d2d”作为“y”,然后作为“d2b”自称“y”被修改并因此得到我们的列表?对不起,如果我问了太多问题,我只是想让基础知识正确!非常感谢你的帮助! – 2010-10-18 18:26:06