这是篇水文。
函数式编程鼓励无状态编程,用函数模拟状态。在编程中,最基础的数据容器是Map,纯函数怎么实现Map呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| type Map func(string) string
func MapOf(kvs ...string) Map { return func(key string) string { for i := 0; i+1 < len(kvs); i += 2 { if kvs[i] == key { return kvs[i+1] } }
return "" } }
func Put(m Map, k, v string) Map { return func(key string) string { if key == k { return v } return m(k) } }
func Get(m Map, k string) string { return m(k) }
|
来点测试。
1 2 3 4 5 6 7 8 9
| func TestFnMap(t *testing.T) { m := MapOf("a", "b", "c", "d") t.Log(Get(m, "a")) t.Log(Get(m, "c"))
m2 := Put(m, "foo", "bar") t.Log(Get(m2, "foo")) }
|