然后将运算符应用于 string |>,这允许链接函数调用。条目h(g(f(x)))被向后读取:函数被调用 first f,它出现在条目的第三个。使用操作符|>,同样的调用可以描述为x |> f |> g | h,即我们对函数取x, try 为 it f, then g, thenh。
操作符|>被称为直接管道(pipe forward)。
我们正在调用一个函数Seq.filter,它类似于扩展方法Enumerable.Where。第一个参数应该是一个谓词函数,它将应用于序列的每个元素(字符)。作为这样的谓词,我们使用System.Char.IsDigit(来自 type 的静态方法char),它接收一个字符作为输入,true如果这个字符是一个数字则返回。
在 C# 中,此代码如下所示:
发生了什么?字符串
"1234asdfgh"被视为字符序列。在 C# 中,字符串实现了接口IEnumerable<char>,在 F# 中对应于类型Seq<char>。然后将运算符应用于 string
|>,这允许链接函数调用。条目h(g(f(x)))被向后读取:函数被调用 firstf,它出现在条目的第三个。使用操作符|>,同样的调用可以描述为x |> f |> g | h,即我们对函数取x, try 为 itf, theng, thenh。操作符
|>被称为直接管道(pipe forward)。我们正在调用一个函数
Seq.filter,它类似于扩展方法Enumerable.Where。第一个参数应该是一个谓词函数,它将应用于序列的每个元素(字符)。作为这样的谓词,我们使用System.Char.IsDigit(来自 type 的静态方法char),它接收一个字符作为输入,true如果这个字符是一个数字则返回。接下来我们看到一个叫做currying的函数式魔法。该调用
Seq.filter System.Char.IsDigit缺少第二个参数,即应用该函数的元素的直接序列System.Char.IsDigit。在函数式 F# 中,这意味着我们有一个新函数,它只接受一个参数,即缺失序列。记住这一点
x |> f = f x。在 F# 中,f带参数的函数调用x是不带括号的,因此它f x的含义与 C# 的含义相同f(x)。"123asdfgh" |> Seq.filter System.Char.IsDigit意思相同Seq.filter System.Char.IsDigit "123asdfgh"。多亏了这个写回,我们在一行中写了一系列对参数的转换,也就是对字符串的转换
"123asdfgh"。此外,在接收到过滤后仅包含数字的序列后,我们将函数应用于它
Seq.length,它将计算其长度。换句话说,这里我们得到了原始字符串中的位数。最后,我们将此数字传递给函数
printf,该函数将打印它。我总结一下。代码如下所示:我们取一串字符,过滤它,只留下数字,计算位数并打印出来。