-- Functional Library
--
-- @file functional.lua
-- @author Shimomura Ikkei
-- @date 2005/05/18
--
-- @brief porting several convenience functional utilities form Haskell,Python etc..
function map(func, tbl)
local newtbl = {}
for i,v in pairs(tbl) do
newtbl[i] = func(v)
end
return newtbl
end
function filter(func, tbl)
local newtbl= {}
for i,v in pairs(tbl) do
if func(v) then
newtbl[i]=v
end
end
return newtbl
end
function head(tbl)
return tbl[1]
end
function tail(tbl)
if table.getn(tbl) < 1 then
return nil
else
local newtbl = {}
local tblsize = table.getn(tbl)
local i = 2
while (i <= tblsize) do
table.insert(newtbl, i-1, tbl[i])
i = i + 1
end
return newtbl
end
end
function foldr(func, val, tbl)
for i,v in pairs(tbl) do
val = func(val, v)
end
return val
end
function reduce(func, tbl)
return foldr(func, head(tbl), tail(tbl))
end
function curry(f,g)
return function (...)
return f(g(unpack(arg)))
end
end
function bind1(func, val1)
return function (val2)
return func(val1, val2)
end
end
function bind2(func, val2)
return function (val1)
return func(val1, val2)
end
end
is = function(check, expected)
return function (...)
if (check(unpack(arg)) == expected) then
return true
else
return false
end
end
end
operator = {
mod = math.mod;
pow = math.pow;
add = function(n,m) return n + m end;
sub = function(n,m) return n - m end;
mul = function(n,m) return n * m end;
div = function(n,m) return n / m end;
gt = function(n,m) return n > m end;
lt = function(n,m) return n < m end;
eq = function(n,m) return n == m end;
le = function(n,m) return n <= m end;
ge = function(n,m) return n >= m end;
ne = function(n,m) return n ~= m end;
}
enumFromTo = function (from,to)
local newtbl = {}
local step = bind2(operator[(from < to) and "add" or "sub"], 1)
local val = from
while val <= to do
table.insert(newtbl, table.getn(newtbl)+1, val)
val = step(val)
end
return newtbl
end
function expand_args(func)
return function(...) return func(arg) end
end
- 待办事项:YCombinator,IteratorChain?,...
示例代码
local product = bind1(reduce, operator.mul)
local sum = expand_args(bind1(reduce, operator.add))
local factorial = curry(product,bind1(enumFromTo,1))
另见:LuaFunctors
最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2009 年 2 月 18 日 下午 3:44 GMT (差异)