Advertisement
Guest User

Untitled

a guest
Apr 25th, 2015
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.77 KB | None | 0 0
  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type Any interface{}
  6. type FuncType func(Any, Any) Any
  7. type ConsType func(FuncType) Any
  8.  
  9. func Cons(a, b Any) ConsType {
  10. return func(fn FuncType) Any {
  11. return fn(a, b)
  12. }
  13. }
  14. func Car(cons ConsType) Any {
  15. head := func(a, b Any) Any { return a }
  16. return cons(head)
  17. }
  18.  
  19. func Cdr(cons ConsType) Any {
  20. tail := func(a, b Any) Any { return b }
  21. return cons(tail)
  22. }
  23.  
  24.  
  25. /*
  26. foldl :: (a -> b -> a) -> a -> [b] -> a
  27. foldl f z [] = z
  28. foldl f z (x:xs) = foldl f (f z x) xs
  29. */
  30. func foldl(fn FuncType, init Any, list ConsType) Any {
  31. if list == nil {
  32. return init
  33. }
  34. head,tail := Car(list),Cdr(list)
  35. rest,_ := tail.(ConsType)
  36.  
  37. return foldl(fn, (fn(init, head)), rest)
  38. }
  39.  
  40. /*
  41. foldr :: (a -> b -> b) -> b -> [a] -> b
  42. foldr f z [] = z
  43. foldr f z (x:xs) = f x (foldr f z xs)
  44. */
  45. func foldr(fn FuncType, fini Any, list ConsType) Any {
  46. if list == nil {
  47. return fini
  48. }
  49.  
  50. head, tail := Car(list), Cdr(list)
  51. rest,_ := tail.(ConsType)
  52. return fn(head, foldr(fn, fini, rest))
  53. }
  54.  
  55. func walkDownList(list ConsType) {
  56. var printer func(a, b Any) Any
  57. printer = func(a, b Any) Any {
  58. fmt.Println(a)
  59. if b == nil {
  60. fmt.Println('m')
  61. return nil
  62. }
  63. if bVal, castOk := b.(ConsType); castOk {
  64. bVal(printer)
  65. }
  66. return nil
  67. }
  68. list(printer)
  69. }
  70. func main() {
  71. fmt.Println("Hello, playground")
  72. a := Cons(12, 13)
  73. print2 := func(x,y Any) Any { return fmt.Sprintf("(%v,%v)",x,y) }
  74. add2:= func(x, y Any) Any {
  75. fmt.Println("...", x,y)
  76. return x.(int) + y.(int)
  77. }
  78. fmt.Println(a(add2))
  79. list := Cons(12, Cons(14, Cons(16, nil)))
  80. fmt.Println(list, '!')
  81. walkDownList(list)
  82. fmt.Println("..",foldl(add2, 0, list))
  83. fmt.Println("!!",foldr(add2, 0, list))
  84.  
  85. fmt.Println("..",foldl(print2, 0, list))
  86. fmt.Println("!!",foldr(print2, 0, list))
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement