Apa tips umum yang Anda miliki untuk bermain golf di F #? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk F # (mis. "Hapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.
Apa tips umum yang Anda miliki untuk bermain golf di F #? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk F # (mis. "Hapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.
Jawaban:
Gunakan function
alih-alih match
bila memungkinkan; itu akan menghemat 6 karakter untuk variabel 1 karakter:
let f=function // ... (14 chars)
vs.
let f x=match x with // ... (20 chars)
Itu juga dapat mengganti kecocokan pola apa pun untuk secara konsisten menyimpan 1 karakter:
match a with| // ... (13 chars)
a|>function| // ... (12 chars)
(function| (* ... *))a // (12 chars)
Gunakan notasi awalan untuk operator infiks ketika Anda bisa - itu akan menyelamatkan Anda dari keharusan mendefinisikan fungsi untuk menggunakannya.
Misalnya, Anda dapat mengubah ini:
List.map(fun i->i+2)[1;1;2;3;5;8]
dalam hal ini:
List.map((+)2)[1;1;2;3;5;8]
Jika Anda tidak bisa menggunakan variabel, gunakan dekonstruksi tuple alih-alih beberapa ekspresi let
let a,b ="",[]
dari pada
let a=""
let b=[]
F # core library mendefinisikan alias untuk System.Console.In
dipanggil stdin
. Ini memungkinkan Anda membaca input.
// Signature:
stdin<'T> : TextReader
Keuntungan besar selain fakta bahwa ini lebih pendek daripada Console
adalah, Anda tidak harus membuka Sistem juga
string pada dasarnya adalah char seq
, ini memungkinkan Anda untuk menggunakan Seq.map
langsung dengan string. Dimungkinkan juga untuk menggunakannya dalam pemahaman[for c in "" do]
Menggunakan sel referensi tidak selalu lebih pendek karena setiap operasi baca disertai dengan karakter tambahan untuk melakukan sel.
Dimungkinkan untuk menulis match .. with
inline lengkap
function|'a'->()|'b'->()|_->()
Tidak perlu spasi putih sebelum dan sesudah karakter non alfanumerik.
String.replicate 42" "
if Seq.exists((<>)'@')s then
if(Seq.exists((<>)'@')s)then
Jika Anda perlu ke kiri atau kanan pad string dengan spasi, Anda dapat menggunakan flag [s] printf [n] untuk itu.
> sprintf "%20s" "Hello, World!";;
val it : string = " Hello, World!"
id adalah singkatan dari fungsi identitas.
let u x=x|>Seq.countBy (fun x->x)
dapat ditulis
let u x=x|>Seq.countBy id
Saya menggunakannya di sini
Terima kasih banyak kepada Laikoni untuk tip ini di salah satu solusi saya .
Pertimbangkan fungsi untuk, katakanlah, menjumlahkan string dengan 3 untuk huruf besar dan 1 untuk semua karakter lainnya. Begitu:
let counter input = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1) input
Dengan eta-konversi, ini dapat ditulis ulang sebagai:
let counter = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
dan memanggil dengan cara yang sama seperti sebelumnya:
counter "Hello world!" |> printfn "%i"
>>
Sekarang anggaplah tantangan awal kita adalah menjumlahkan string dengan 3 untuk huruf besar dan 1 untuk huruf kecil, dan semua karakter lain dikecualikan.
Kami mungkin menulis ini sebagai:
let counter input = Seq.filter Char.IsLetter input |> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Kita dapat menggunakan operator komposisi-maju ( >>
) untuk menghubungkan kedua fungsi ( Seq.filter
dan Seq.sumBy
) bersama-sama. Dengan eta-konversi, definisi fungsi akan menjadi:
let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Chris Smith melakukan penulisan besar-besaran >>
pada operator di blog MSDN-nya .
Bila mungkin Seq
lebih pendek dari List
:
[[1];[2;3];[4];[5]|>List.collect
[[1];[2;3];[4];[5]|>Seq.collect
adalah salah satu char lebih pendek ...
let f = [(0,1);(1,4)]|>Seq.map(fst)
printfn "%A" f
dapat ditulis
let f = [0,1;1,4]|>Seq.map fst
printfn "%A" f
Ini akan mulai menghasilkan bahkan pada satu baris karakter baru dalam kode Anda. Satu use case mungkin:
string.Concat"\n"
string.Concat"
"
Terinspirasi dari jawaban Chiru untuk es6 .
Digunakan di sini
.NET menawarkan banyak builtin yang bagus. F # bisa menggunakannya, jadi jangan lupakan mereka!
Contoh:
open System.Linq
Ini bisa membantu!
for i in[0..2]
for i=0 to 2
Kata module
kunci dapat digunakan untuk mempersingkat nama modul saat digunakan berulang kali. Sebagai contoh:
Array.fold ...
Seq.iter ...
List.map ...
bisa menjadi
module A=Array
A.fold ...
module S=Seq
S.iter ...
module L=List
L.map ...
Ini lebih berguna untuk program yang lebih lama di mana metode modul digunakan berulang kali (dan harus sepenuhnya dinamai setiap kali karena mereka memiliki RequireQualifiedAccess
pengubah), dan memungkinkan mencukur beberapa karakter, terutama ketika lebih berguna untuk menggunakan array CLR biasa (misalnya, mutabilitas ) daripada F # seq
atau list
.