Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 计算给定字符串F中的元音数#_String_Count_Functional Programming_F# - Fatal编程技术网

String 计算给定字符串F中的元音数#

String 计算给定字符串F中的元音数#,string,count,functional-programming,f#,String,Count,Functional Programming,F#,我需要一个使用List.fold的方法来计算给定字符串中的元音数。 到目前为止,我有这个方法 let vowels = ['a';'e';'i';'o';'u'] let isVowel = fun c -> vowels |> List.contains c let count = String.filter isVowel >> String.length printfn "%A" (count "aaaa&q

我需要一个使用List.fold的方法来计算给定字符串中的元音数。 到目前为止,我有这个方法

let vowels = ['a';'e';'i';'o';'u']
let isVowel =
    fun c -> vowels |> List.contains c

let count =
    String.filter isVowel
    >> String.length

printfn "%A" (count "aaaa")

它工作得很好,但我不知道如何制作一个列表。使用相同的Is元音方法折叠一个。这是我的尝试

下面的代码不起作用,它的目的是反映我的想法。由于fold方法应用is元音(),它在字符串中的每个字符上返回true/false,因此如果条件为true,它将向作为0参数的累加器添加1。当我尝试在索引anon函数中使用if-else时,我得到一个错误

let isVowel x = 
    match x with 
    | 'a' -> true
    | 'e' -> true
    | 'i' -> true
    | 'o' -> true
    | 'u' -> true
    | _ -> false

let countNumOfVowels =
    List.fold (fun (isVowel) (x) -> x + 1) 0 ["aaaa"]

您试图折叠列表,但您的源实际上是一个字符串

如果使用
Seq.fold
,字符串可以解释为字符序列:

"abracadabra" |> Seq.fold (fun i c -> if isVowel c then i + 1 else i) 0

// val it : int = 5

这就是我要找的。谢谢你,格斯

let countNumOfVowels str =
    List.fold (fun (x: int) (c: char) -> if (isVowel c) then x + 1 else x) 0 (Seq.toList str)

countNumOfVowels "Hello"

你能告诉我你是如何在匿名函数中使用if/else的吗?让countNumofvowells=List.fold(fun(isVowel)x->if isvowell然后x+1)0[“aaaa”]这对我来说没有意义,但至少我试过了)isvowell没有参数,该函数没有用于调用isvouel的字符。我可以将字符串转换为字符序列并在列表中使用它。fold?当然,您可以先执行
List.ofSeq
,然后执行
List.fold
。注意,您也可以在isvouels函数中使用相同的逻辑,从而简化它。使元音也成为字符串,因此:
让isvowells c=Seq.contains c“aeiou”
> countNumOfVowels "Hello";;
val it : int = 2