te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>functional programming - Monads in JavaScript? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

functional programming - Monads in JavaScript? - Stack Overflow

programmeradmin6浏览0评论

How would an example JavaScript code look like that uses Monad? I'm asking because understanding Monad is much clearer if I can see a code example (and JavaScript being a simple, functional language it could be the best language to use to learn it).

How would an example JavaScript code look like that uses Monad? I'm asking because understanding Monad is much clearer if I can see a code example (and JavaScript being a simple, functional language it could be the best language to use to learn it).

Share Improve this question asked Dec 28, 2011 at 12:55 TowerTower 103k131 gold badges364 silver badges519 bronze badges 4
  • Tell something about Monad, how it is diff from javascript ? – Umesh Patil Commented Dec 28, 2011 at 13:00
  • 1 @Umesh - en.wikipedia/wiki/Monad_(functional_programming) – James Allardice Commented Dec 28, 2011 at 13:02
  • 2 JQuery is pretty much a monad in js. – J. Holmes Commented Dec 28, 2011 at 13:09
  • I suppose, code "using Monads" is the same as in other languages. For better understanding I'd better look into writing monads. Also, just google: "monads javascript". There're a bunch of articles. – kirilloid Commented Dec 28, 2011 at 13:15
Add a ment  | 

1 Answer 1

Reset to default 18

I would start by writing your own monad in JavaScript. The list monad is a great place to start; I find it by far the most useful. Simply define functions which do the following:

  1. Create a list of one given item (call this mreturn).
  2. Create an empty list (call this mzero).
  3. Append one list to another (call this mplus).
  4. Apply a function to transform every element in a given list (call this map).
  5. "Flatten" a list of lists into a simple list by concatenating the lists (call this join).

This defines what's known as an "additive monad" (mzero and mplus form the "additive" part). Play around to see what interesting things you can do using only these functions to operate on lists. For example, you can pute the list of all even numbers on a schoolkid's multiplication table like so:

var nums = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var even_products = join(map(join(map(nums, function (x) {
        return map(nums, function(y) { return x * y })
    })),
    function (x) { if (x % 2 == 0) { return mreturn(x) } else { return mzero() } }
));

Alternatively, bine map and join together as a single function defined as function bind(l, f) { return join(map(l, f)) }. bind can be used instead of map and join and is used more often in e.g. Haskell. The same exercise above can then be written:

var nums = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var even_products = bind(
    bind(nums, function (x) {
        return bind(nums, function (y) { return mreturn(x * y) })
    }),
    function (x) { if (x % 2 == 0) { return mreturn(x) } else { return mzero() } }
);

Finally, you may want to incorporate these functions as part of a new list prototype (or whatever JavaScript has that passes for classes these days), so you can instead write the jQuery-esque:

var nums = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var even_products = nums
    .bind(function (x) { return nums.bind(function (y) { return mreturn(x * y) }) })
    .bind(function (x) { if (x % 2 == 0) { return mreturn(x) } else { return mzero() } });
发布评论

评论列表(0)

  1. 暂无评论