F#中是否有任何内置方式可以将true
转换为1
和false
转换为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#中执行此操作的方法是什么?
答案 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);
}