F# 简单的计算一例

  1. // F# Visual Studio Sample File
  2. //
  3. // This file contains some sample constructs to guide you through the
  4. // primitives of F#.
  5. //
  6. // Contents:
  7. //   - Simple computations
  8. //   - Functions on integers.  
  9. //   - Tuples 
  10. //   - Strings
  11. //   - Lists
  12. //   - Arrays
  13. //   - Functions
  14. // Simple computations   简单的计算
  15. // ---------------------------------------------------------------
  16. // Here is a simple computation.  Note how code can be documented
  17. // with '///' comments.  You can use the extra --html-* command line
  18. // options to generate HTML documentation directly from these comments.
  19. /// The position of 'c' in a sample string
  20. let posc = String.index "abcdef" 'c'
  21.   // Try re-typing the above line to see intellisense in action.
  22.   // Try ctrl-J on (partial) identifiers.
  23. // Simple arithmetic:
  24. let xA = 1
  25. let xB = 2
  26. let xC = xA + xB
  27. let twist x = 10 - x
  28. do  Printf.printf "res = %d/n" (twist (xC+4))
  29.   // note: let binds values and functions
  30.   // note: do <expr> evaluates expression 
  31. do Printf.printf "stop"
  32. // Functions on integers.  
  33. // ---------------------------------------------------------------
  34. let inc x = x + 1  //自增1 函数
  35. let rec fact n = if n=0 then 1 else n * fact (n-1)
  36. //hsg write line
  37. do Printf.printf "inc(4)=%d/n"  (inc 4)
  38. do Printf.printf "fact=f(5)=%d/n"  (fact (inc 4))
  39. //hsg write line 定义一个函数f(X^2+2X+5)
  40. let one_x x=x*x+2*x+5
  41. do Printf.printf "one_x(4)=%d/n"  (one_x 4)  //16+8+5=29
  42. let one_xy x y=x*x+y*y+5
  43. /// Highest-common-factor 
  44. let rec hcf a b =           // notice: 2 arguments seperated by spaces
  45.   if a=0 then
  46.     b
  47.   else
  48.     if a<b then
  49.       hcf a (b-a)           // notice: 2 arguments seperated by spaces
  50.     else
  51.       hcf (a-b) b
  52.   // note: function arguments are usually space seperated.
  53.   // note: let rec binds recursive functions.
  54.       
  55. // Tuples.  These combine values into packets.
  56. // ---------------------------------------------------------------
  57. let pA = (1,2,3)
  58. let pB = (1,"fred",3.1415)
  59. let swap (a,b) = (b,a)
  60. /// Note: hcf2 takes one argument which is in fact a tuple.
  61. let rec hcf2 (a,b) = 
  62.   if a = 0 then b
  63.   else if a<b then hcf2 (a,b-a)
  64.   else hcf2 (a-b,a)
  65. // Booleans.
  66. // ---------------------------------------------------------------
  67. let bA = true
  68. let bB = false
  69. let bC = not bA && (bB || false)
  70. //hsg write line
  71. let hsgA=true
  72. let hsgB=false
  73. let hsgC=not hsgA && (hsgB || false)
  74. // Strings.
  75. // ---------------------------------------------------------------
  76. let sA  = "hello"
  77. let sB  = "world"
  78. let sC  = sA + " " + sB
  79. let sC2 = String.concat " " [sA;sB]
  80. do  Printf.printf "sC = %s, sC2 = %s/n" sC sC2
  81. let s3 = Printf.sprintf "sC = %s, sC2 = %d/n" sC sC2.Length
  82. //hsg write line
  83. let h_sA="hello"
  84. let h_sb="world"
  85. let h_sC=h_sA+"  "+h_sb
  86. let h_sC2=String.concat "" [h_sA;h_sb]
  87. do Printf.printf "sC=%s,sC2=%s/n" h_sC h_sC2
  88. // Functional Lists.
  89. // ---------------------------------------------------------------
  90. let xsA = [ ]           // empty list
  91. let xsB = [ 1;2;3 ]     // list of 3 ints
  92. let xsC = 1 :: [2;3]    // :: is cons operation.
  93. do print_any xsC
  94. let rec sumList xs =
  95.   match xs with
  96.   | []    -> 0
  97.   | y::ys -> y + sumList ys
  98.     
  99. let y   = sumList [1;2;3]  // sum a list
  100. let xsD = xsA @ [1;2;3]    // append
  101. let xsE = 99 :: xsD        // cons on front
  102. // Mutable Arrays, a primitive for efficient computations
  103. // ---------------------------------------------------------------
  104. let arr = Array.create 4 "hello"
  105. do  arr.(1) <- "world"
  106. do  arr.(3) <- "don"
  107. let nA = Array.length arr  // function in Array module/class
  108. let nB = arr.Length        // instance method on array object
  109. let front = Array.sub arr 0 2
  110.   // Trying re-typing the above line to see intellisense in action.
  111.   // Note, ctrl-J on (partial) identifiers re-activates it.
  112. // Other common data structures
  113. // ---------------------------------------------------------------
  114. // See namespaces 
  115. //   System.Collections.Generic
  116. //   Microsoft.FSharp.Collections
  117. //   Hashtbl
  118. //   Set
  119. //   Map
  120. // Functions
  121. // ---------------------------------------------------------------
  122. let inc2 x = x + 2              // as a function definition
  123. let inc3   = fun x -> x + 3     // as a lambda expression
  124. let ysA = List.map inc2 [1;2;3]
  125. let ysB = List.map inc3 [1;2;3]
  126. let ysC = List.map (fun x -> x+4) [1;2;3]
  127. // Pipelines:
  128. let pipe1 = [1;2;3] |> List.map (fun x -> x+4) 
  129. let pipe2 = 
  130.   [1;2;3] 
  131.   |> List.map (fun x -> x+4) 
  132.   |> List.filter (fun x -> x>5) 
  133. // Composition pipelines:
  134. let processor = List.map (fun x -> x+4) >> List.filter (fun x -> x>5) 
  135. // Types - datatypes
  136. // ---------------------------------------------------------------
  137. type expr = 
  138.   | Num of int
  139.   | Add of expr * expr
  140.   | Sub of expr * expr
  141.   | Mul of expr * expr
  142.   | Div of expr * expr
  143.   | Var of string
  144.   
  145. let lookup id (env : (string * int) list) = List.assoc id env
  146.   
  147. let rec eval env exp = match exp with
  148.   | Num n -> n
  149.   | Add (x,y) -> eval env x + eval env y
  150.   | Sub (x,y) -> eval env x - eval env y
  151.   | Mul (x,y) -> eval env x * eval env y
  152.   | Div (x,y) -> eval env x / eval env y
  153.   | Var id    -> lookup id env
  154.   
  155. let envA = [ "a",1 ;
  156.              "b",2 ;
  157.              "c",3 ]
  158.              
  159. let expT1 = Add(Var "a",Mul(Num 2,Var "b"))
  160. let resT1 = eval envA expT1
  161. // Types - records
  162. // ---------------------------------------------------------------
  163. type card = { name  : string;
  164.               phone : string;
  165.               ok    : bool }
  166.               
  167. let cardA = { name = "Alf" ; phone = "+44.1223.000.000" ; ok = false }
  168. let cardB = {cardA with phone = "+44.1223.123.456"; ok = true }
  169. let string_of_card c = 
  170.   c.name + " phone: " + c.phone + (if not c.ok then " (unchecked)" else "")
  171. // Here's a longer construction syntax should you get name conflicts:
  172. let cardC = {  new card 
  173.                with name  = "Alf" 
  174.                and  phone = "+44.1223.000.000" 
  175.                and  ok = false }
  176. // Types - interfaces, which are like records of functions
  177. // ---------------------------------------------------------------
  178. type IPeekPoke = interface
  179.   abstract member Peek: unit -> int
  180.   abstract member Poke: int -> unit
  181. end
  182.               
  183. // Types - classes
  184. // ---------------------------------------------------------------
  185. type widget = class
  186.   val mutable state: int 
  187.   member x.Poke(n) = x.state <- x.state + n
  188.   member x.Peek() = x.state 
  189.   member x.HasBeenPoked = (x.state <> 0)
  190.   new() = { state = 0 }
  191. end
  192.               
  193. // Types - classes with interface implementations
  194. // ---------------------------------------------------------------
  195. type wodget = class
  196.   val mutable state: int 
  197.   interface IPeekPoke with 
  198.     member x.Poke(n) = x.state <- x.state + n
  199.     member x.Peek() = x.state 
  200.   end
  201.   member x.HasBeenPoked = (x.state <> 0)
  202.   new() = { state = 0 }
  203. end
  204. do Printf.printf "stop"
  205.               

你可能感兴趣的:(F# 简单的计算一例)