Answers:
如果您无法使用变量,请使用元组解构,而不要使用多个let表达式
let a,b ="",[]
代替
let a=""
let b=[]
F#核心库定义了一个别名System.Console.In
叫做stdin
。这些使您可以阅读输入。
// Signature:
stdin<'T> : TextReader
除了它比以前更短之外Console
,最大的优势是,您也不必打开系统
string基本上是一个char seq
,这使您可以Seq.map
直接与字符串一起使用。也可以在理解中使用它们[for c in "" do]
使用参考单元并不总是那么短,因为每个读取操作都会附带一个附加字符来解除对单元的引用。
可以编写完整的match .. with
内联
function|'a'->()|'b'->()|_->()
非字母数字字符之前和之后都不需要空格。
String.replicate 42" "
if Seq.exists((<>)'@')s then
if(Seq.exists((<>)'@')s)then
如果需要用空格左或右填充字符串,可以使用[s] printf [n]标志。
> sprintf "%20s" "Hello, World!";;
val it : string = " Hello, World!"
考虑一个函数,例如,将一个字符串加起来,其中大写字母为3,所有其他字符为1。所以:
let counter input = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1) input
通过eta转换,可以将其重写为:
let counter = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
并以与以前相同的方式调用:
counter "Hello world!" |> printfn "%i"
>>
现在假设我们最初的挑战是将一个字符串加起来,其中大写字母为3,小写字母为1,而所有其他字符都被排除在外。
我们可以这样写:
let counter input = Seq.filter Char.IsLetter input |> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
我们可以使用前向运算符(>>
)将两个函数(Seq.filter
和Seq.sumBy
)链接在一起。使用eta转换时,函数定义将变为:
let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
let f = [(0,1);(1,4)]|>Seq.map(fst)
printfn "%A" f
可以写
let f = [0,1;1,4]|>Seq.map fst
printfn "%A" f
.NET提供了许多不错的内置函数。F#可以使用它们,所以请不要忘记它们!
例:
open System.Linq
可能会有帮助!