F#错误FS001:“字符串”与类型“ seq <字符串>

时间:2019-12-29 15:07:28

标签: string count f#

我正在尝试创建一个可以计算给定String中元音的函数。这就是我想要做的。我正在尝试仅使用管道运算符和composition(>>)运算符解决问题。

let vowels = ["a";"e";"i";"o";"u"]

let isVowel = fun c-> vowels |> List.contains c

let inline vowelCount string1 =
 string1
|> Seq.toList
|> List.filter isVowel

这是我在F#交互式中运行代码时遇到的问题:

“错误FS0001:类型'字符串'与类型'seq'不兼容”

我在哪里做错了?我不明白什么?提前致谢。

3 个答案:

答案 0 :(得分:3)

您似乎想要将vowels定义为字符列表而不是字符串列表:

let vowels = ['a';'e';'i';'o';'u']

此单一更改将使您的代码得以编译,尽管不能达到目标。

let vowels = ['a';'e';'i';'o';'u']

let isVowel = fun c-> vowels |> List.contains c

let inline vowelCount string1 =
 string1
|> Seq.toList
|> List.filter isVowel

vowelCount "qwerty"

这是一种替代解决方案,可以满足您计算字符串中元音的要求

let vowels = ['a';'e';'i';'o';'u']
let isVowel c = List.contains c vowels
let vowelCount = Seq.filter isVowel >> Seq.length

答案 1 :(得分:1)

  

我在哪里做错了?我不明白什么?预先感谢。

  1. 您正在发布可编译的代码,并说存在类型错误。实际上是您没有包括的后续代码才给出错误。
  2. 您没有检查代码的类型签名。 Intellisense会告诉您函数的类型签名,并告诉您string1seq<string>
  3. 您正在过度使用类型推断。如果知道函数输入的类型,则可以对其进行注释(例如,用string1:string代替string1)。然后,这将在代码的早期显示错误(当您尝试将List.filter isVowel应用于char list时)。

答案 2 :(得分:1)

您也可以使用Seq.sumBy函数直接执行此操作:

let vowelcount : seq<char> -> int = 
    Seq.sumBy (function 'a'|'e'|'i'|'o'|'u' -> 1 | _ -> 0)