F#高尔夫技巧


21

您对F#打高尔夫球有哪些一般提示?我正在寻找可用于编码一般至少在某些程度上针对F#的高尔夫问题的想法(例如,“删除评论”不是答案)。请为每个答案发布一个提示。

Answers:


9

尽可能使用function代替match;它将为1个字符的变量保存6个字符:

let f=function // ... (14 chars)

let f x=match x with // ... (20 chars)

它还可以替换任何模式匹配项以一致地保存1个字符:

match a with|          // ... (13 chars)
a|>function|           // ... (12 chars)
(function| (* ... *))a // (12 chars)

8

是否需要对尚未限制类型的变量使用方法?只需将其与您希望它的类型的文字进行比较,然后丢弃结果以注释该变量的类型:

let f (x:string)=x.Length
let f x=x="";x.Length

7

可以的话,请为前缀运算符使用前缀表示法-这样就不必为使用它们定义函数。

例如,您可以打开以下代码:

List.map(fun i->i+2)[1;1;2;3;5;8]

到这个:

List.map((+)2)[1;1;2;3;5;8]


5

元组解构

如果您无法使用变量,请使用元组解构,而不要使用多个let表达式

let a,b ="",[]

代替

let a=""
let b=[]

从标准输入读

F#核心库定义了一个别名System.Console.In叫做stdin。这些使您可以阅读输入。

// Signature:
stdin<'T> :  TextReader

msdn上的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!"
    

    Core.Printf模块



3

功能的eta转换

非常感谢Laikoni我的解决方案之一提供的提示。

考虑一个函数,例如,将一个字符串加起来,其中大写字母为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.filterSeq.sumBy)链接在一起。使用eta转换时,函数定义将变为:

let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)

克里斯·史密斯(Chris Smith)>>在其MSDN博客上为运营商做了出色的文章


2

尽可能Seq短于List

[[1];[2;3];[4];[5]|>List.collect
[[1];[2;3];[4];[5]|>Seq.collect

短一个字符...




1

使用.NET

.NET提供了许多不错的内置函数。F#可以使用它们,所以请不要忘记它们!

例:

open System.Linq

可能会有帮助!


1

使用lambda保存一个字节。例如,这:

let f x=x*x

可以表示为:

fun x->x*x


1

module关键字可用于重复使用时,缩短模块名称。例如:

Array.fold ...
Seq.iter ...
List.map ...

可以变成

module A=Array
A.fold ...
module S=Seq
S.iter ...
module L=List
L.map ...

这对于较长的程序会更有用,在较长的程序中,模块方法被重复使用(并且每次必须使用全名,因为它们都有RequireQualifiedAccess修饰符),并且可以减少一些字符,尤其是在使用常规CLR数组(例如,可变性)更有用时),而不是F#seqlist

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.