Less code, little to no C# like source bloat because of:
- Type inference
- Automatic generics
- Functions instead of methods
- seqs and tuples + unpacking (a'la python)
- pattern matching ("switch case" that matches types & unpacks)
| open System | |
| module Ast = | |
| type var = string | |
| type Expr = | |
| | Number of float | |
| | BinOp of (float -> float -> float) * Expr * Expr | |
| | FunApply of var * Expr list | |
| with | |
| static member Sum (e1, e2) = BinOp (( + ), e1, e2) |
| open FSharp.Data | |
| open System.IO | |
| type provider = XmlProvider<"./sample.xml"> | |
| [<EntryPoint>] | |
| let main argv = | |
| let path = @"C:\blah.csproj" | |
| let f = File.ReadAllText path | |
| let data = provider.Parse f | |
| public class Collector<TKey> | |
| { | |
| private HashSet<TKey> seen = new HashSet<TKey>(); | |
| public IEnumerable<TData> CollectBy<TData>(IEnumerable<TData> input, Func<TData, TKey> extractKey) | |
| { | |
| foreach (var inp in input) | |
| { | |
| var key = extractKey(inp); | |
| if (seen.Contains(key)) |
| open System.IO | |
| open OfficeOpenXml | |
| open System.Data | |
| [<EntryPoint>] | |
| let main argv = | |
| let f = FileInfo("test.xlsx") | |
| use p = new ExcelPackage(f) | |
| let ws = p.Workbook.Worksheets.Add("testi") | |
| use dt = new DataTable("mundata") |
| // deprecate a set of properties. Handy e.g. to see bad access in angular directives where TypeScript doesn't help you | |
| class FooClass { ... } | |
| function deprecate(klass: any, props: string[]) { | |
| props.forEach(prop => { | |
| Object.defineProperty(klass.prototype, prop, { | |
| get: () => { debugger; console.log('BAD READ', prop) }, | |
| set: () => console.log('BAD WRITE', prop) | |
| }) | |
| }) |
| [ | |
| { "key": "ctrl+left", "command": "cursorHome" }, | |
| { "key": "ctrl+right", "command": "cursorEnd" } | |
| ] |
| class CheckedTranslate { | |
| static $inject = ['$rootScope', '$translate'] | |
| constructor(private $rootScope: ng.IRootScopeService, private $translate: ng.translate.ITranslateService) {} | |
| translate(localizations: any) { | |
| // obviously this mutates passed localizations object behind your back | |
| this.$rootScope.$on('$translateChangeSuccess', () => { | |
| for (var key in localizations) { | |
| localizations[key] = this.$translate.instant(localizations[key]); | |
| } | |
| }) |
| emphasis { font-style: italic; } | |
| strong { font-weight: bold; } | |
| header { color: rgba(0, 0, 128, 1); } | |
| comment { color: rgba(96, 139, 78, 1); } | |
| constant.language { color: rgba(86, 156, 214, 1); } | |
| constant.numeric { color: rgba(181, 206, 168, 1); } | |
| constant.regexp { color: rgba(100, 102, 149, 1); } | |
| constant.rgb-value { color: rgba(212, 212, 212, 1); } | |
| entity.name.tag { color: rgba(86, 156, 214, 1); } | |
| entity.name.function { color: rgba(212, 212, 212, 1); } |
| (f => { | |
| try { | |
| document.write(f("Vampire")); | |
| } | |
| catch (e) {}; | |
| })(function SaveWorld(startup) { | |
| return world.savedBy(startup); | |
| }); |