从bool转换为int(true - > 1和false - > 0)

时间:2013-09-08 11:56:21

标签: f#

F#中是否有任何内置方式可以将true转换为1false转换为0?这在C,C ++等语言中很简单。

作为一些背景知识,我试图解决教科书中的练习(Functional Programming Using F#中的练习2.4),该练习要求F#函数occFromIth(str,i,ch)返回字符{{的出现次数}。 1}}在ch字符串中的j位置str

我的解决方案是

j >= i

但我不喜欢代码重复,所以我写了

let rec occFromIth (str : string, i, ch) =
    if i >= str.Length then 0
    else if i < 0 || str.[i] <> ch then occFromIth(str, i+1, ch)
    else 1 + occFromIth(str, i+1, ch)

我想另一种选择是以C / C ++ conditional operator

的风格使用let boolToInt = function | true -> 1 | false -> 0 let rec occFromIth (str : string, i, ch) = if i >= str.Length then 0 else boolToInt (not (i < 0 || str.[i] <> ch)) + occFromIth(str, i+1, ch)
if... then... else...

let rec occFromIth (str : string, i, ch) =
    if i >= str.Length then 0
    else (if (not (i < 0 || str.[i] <> ch)) then 1 else 0) + occFromIth(str, i+1, ch)

在F#中执行此操作的方法是什么?

3 个答案:

答案 0 :(得分:6)

System.Convert.ToInt32(bool) - 我对F#不太熟悉,但我相信使用函数是否相同无论是否内置:function(arg0,arg1,...)。因此,在这种情况下,您只需拨打System.Convert.ToInt32(myBool)

答案 1 :(得分:4)

你真的不需要bool to int或int to bool,因为你可以达到以下结果:

let occFromIth (str : string, i, ch) =
    str 
    |> Seq.mapi (fun j c -> (j,c))
    |> Seq.filter (fun (j,c) -> j >= i && c = ch)
    |> Seq.length 

答案 2 :(得分:-2)

做一个函数还是用内建是有区别的。任何比较的CPU指令都会返回一个转换为1和0的位模式的结果。这可以用来做无分支编程,这取决于情况更多有效然后分支。无需分支即可找到对值的比较

   Int min(int a, int b) {
         Int temp = a < b;
         Return a*temp + b*(1-temp);
   }
相关问题