Skip to content

Instantly share code, notes, and snippets.

@Javran
Created March 17, 2015 19:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Javran/2617860a16cd05e576f1 to your computer and use it in GitHub Desktop.
Save Javran/2617860a16cd05e576f1 to your computer and use it in GitHub Desktop.
(10:25:20 PM) methou [~methou@159.226.118.47] entered the room.
(10:25:59 PM) haisheng [~user@c-76-103-237-46.hsd1.ca.comcast.net] entered the room.
(10:26:47 PM) methou: 听说这里有活动?
(10:31:53 PM) Javran: methou: 嗯
(10:31:59 PM) methou: Cool!
(10:32:08 PM) Javran: 大概就是FizzBuzz相关的东西吧
(10:32:23 PM) Javran: 有什么不明白的大家在这可以讨论下
(10:46:45 PM) rink1969 [2a784b03@gateway/web/freenode/ip.42.120.75.3] entered the room.
(10:54:50 PM) scturtle [~scturtle@175.159.80.105] entered the room.
(10:57:08 PM) Reflexivity [~javran@c-73-200-214-152.hsd1.md.comcast.net] entered the room.
(10:57:21 PM) Reflexivity left the room (quit: Client Quit).
(10:57:43 PM) shouya [~shouya@2607:fb90:120:f430:5fa3:69ab:c6e3:9c83] entered the room.
(11:02:02 PM) Javran: ㄟ大家好,有现在的说句话
(11:02:20 PM) rink1969: 在呢
(11:02:34 PM) scturtle: (* ̄∇ ̄)ノ
(11:04:07 PM) Javran: 总觉好多人都挂着不说话呢..
(11:04:29 PM) Javran: ..anyway我觉得先开始好了
(11:04:59 PM) rink1969: 上班挂机中。不顾这会刚好事情不多^_^
(11:05:10 PM) Javran: 嗯那挺好
(11:05:10 PM) cjl_ [6abb5ec3@gateway/web/freenode/ip.106.187.94.195] entered the room.
(11:05:44 PM) scturtle: irc 是没有 log 的吧?
(11:06:00 PM) Javran: 总之先感谢大家能来捧场了,比预想的人数多xD
(11:06:07 PM) Javran: scturtle: 没有记录
(11:06:23 PM) Javran: 时候估计是得查本机聊天记录得到
(11:06:27 PM) Javran: 得到/的
(11:06:54 PM) Javran: 所以当时有考虑用gitter什么的那个可以保存几月的聊天记录
(11:07:31 PM) Javran: 回归正题吧,大家大概都看到什么程度了呢?
(11:08:33 PM) Tyler_Ling [65468726@gateway/web/freenode/ip.101.70.135.38] entered the room.
(11:09:03 PM) shouya: 算是讀完了?
(11:09:14 PM) Tyler_Ling: Hello world~
(11:09:25 PM) Javran: 嗯,我想看看大家都读得怎么样
(11:09:31 PM) Javran: Tyler_Ling: hello~
(11:09:59 PM) rink1969: 文章看了一遍,github上的讨论也都看了。
(11:10:11 PM) Javran: 嗯很好!
(11:10:13 PM) Tyler_Ling: TwT Haskell入门没多久,最近看完了LYAH,RWH看了一半正在啃。。来看各位大神讨论了
(11:10:22 PM) Javran: 虽然那部分到后面就有点看不懂了
(11:10:55 PM) Javran: 其实我是没怎么看过RWH啦
(11:11:22 PM) Javran: 哦对,关于LYAH我想到点东西
(11:11:30 PM) Tyler_Ling: 里面的demo实在太多。。有的时候会晕
(11:11:35 PM) Javran: https://github.com/bitemyapp/learnhaskell
(11:11:54 PM) ***scturtle 最近有本 Haskell Data Analysis Cookbook 也很 real world
(11:11:55 PM) Javran: 这个家伙写的haskell教程很不错的
(11:12:07 PM) scc left the room (quit: ).
(11:12:34 PM) Javran: 哦这个我就不怎么知道了
(11:13:11 PM) Javran: 这么着大家看如何,我们FizzBuzz逐小章讨论
(11:13:21 PM) Javran: 大家没读过的部分也可以JIT一下
(11:14:16 PM) Javran: 我觉得小组的目的不是一定要看懂多少,希望大家通过讨论之后对这些概念思维什么的更加comfortable一些就达到目的了
(11:14:40 PM) rink1969: 我先问个小白问题吧。文章里面比较在意没有多余的比较。github上讨论中给出的那些代码满足这个要求么?那些代码比较抽象,看不太出来。。。
(11:15:10 PM) Javran: rink1969: 那些不一定都满足这个要求
(11:15:32 PM) ***scturtle 像 shouya 的那种组合方式就避免了 mod 呀
(11:15:39 PM) Javran: 我最初发那个代码只是试试看没看文中提供的解法时能想到些什么
(11:16:38 PM) Javran: scturtle: 嗯是呀,不过那个效率会受到输入比较大的影响感觉...
(11:17:01 PM) Javran: 不过那个思路确实和别的都不太一样吧
(11:17:10 PM) rink1969_ [2a784b04@gateway/web/freenode/ip.42.120.75.4] entered the room.
(11:17:34 PM) Javran: 九瓜说的那部分话可能就有点太深奥的感觉了...
(11:18:42 PM) fishtreesugar [3afb92da@gateway/web/freenode/ip.58.251.146.218] entered the room.
(11:18:51 PM) rink1969 left the room (quit: Ping timeout: 246 seconds).
(11:18:52 PM) Javran: 我可能之前也说过,个人觉得FizzBuzz想强调的就是利用context之间的compose能做到的一种事情吧
(11:19:01 PM) scturtle: jiugua 抽象成的 monoid 真的很不错呢
(11:19:39 PM) Javran: 嗯
(11:20:16 PM) Javran: 现在我想征求一下意见,是我们逐个小章这么过一遍还是先把issue里那些东西稍微讨论下呢?
(11:20:45 PM) shouya: 嗯,
(11:20:51 PM) shouya: 其實我那個方法有問題,
(11:21:07 PM) Javran: 九瓜那个MonadCompreshension感觉也是比较惊艳的
(11:21:29 PM) shouya: 嗯嗯,我也是剛學到還能這樣用法
(11:21:30 PM) Javran: 我之前是不知道list comprehension也可以拿来那么用的
(11:22:15 PM) Javran: 没什么意见的话我们一章一章过一遍?
(11:22:34 PM) rink1969_: 也可以
(11:25:18 PM) Javran: 那彳亍
(11:25:44 PM) Javran: 先看看"The FizzBuzz Problem"有没什么疑问或者不理解的吧
(11:28:20 PM) Javran: 可能有点离题,我突然在想有没基于jterator的解法
(11:28:25 PM) Javran: iterator
(11:29:08 PM) rink1969_: 文章里面说程序要 reflects the information-flow structure 感觉就是有限状态机哦
(11:29:13 PM) Javran: 也就是一组iterator, 其中一个逢3归零,一个逢5归零...etc
(11:29:45 PM) scturtle: iterator?我只知道 python 的,详细点?
(11:29:49 PM) Javran: 这个地方我其实并不理解为什么叫"information-flow structure"
(11:30:06 PM) Javran: :t writer
(11:30:07 PM) lambdabot: MonadWriter w m => (a, w) -> m a
(11:31:18 PM) Javran: @let mkNext n = \x -> if x == n then 0 else succ x
(11:31:21 PM) lambdabot: Defined.
(11:31:29 PM) scturtle: writer monad 来做的话也是 concat 吧,又回到 monoid 了,最后还是要判断 null
(11:31:58 PM) Javran: > take 10 (iterate (mkNext 3) 0)
(11:32:00 PM) lambdabot: [0,1,2,3,0,1,2,3,0,1]
(11:32:05 PM) rink1969_: 你说的iterator的思路,我觉得跟文章就很像了。就是通过模拟一个机器出来执行状态机操作
(11:32:17 PM) Javran: 然后lift到writer去就有日志了
(11:32:27 PM) shouya_ [~shouya@199-204-83-69.lfytina2.metronetinc.net] entered the room.
(11:32:29 PM) Javran: 这个不一样
(11:32:41 PM) Javran: 我的思路是只思考"下一个是什么"
(11:33:26 PM) Javran: 因为文中提到的是"each player counts one number in turn"
(11:34:11 PM) Javran: 我并不关心效率怎么样,只是提供思路,writer确实没事都要concat一下不过我觉得暂时不是什么大问题
(11:34:37 PM) scturtle: > map (`mod` 3 ) [0..9]
(11:34:38 PM) lambdabot: [0,1,2,0,1,2,0,1,2,0]
(11:34:51 PM) Javran: 既然思考下一个是什么的话那需要几特殊处理就拿几个iterator出来就是了
(11:34:54 PM) rink1969_: 你的意思是把数字表示成(n mod 3, n mod 5)这样的元组?
(11:34:59 PM) Javran: 对的
(11:35:27 PM) Javran: 其实绕开mod/rem的问题了
(11:35:47 PM) Javran: 一个个迭代的话或许会好一些,要么就不如直接算
(11:35:48 PM) rink1969_: 呵呵,韩信点兵
(11:36:33 PM) Javran: 别呵呵呀我好害怕这词...
(11:36:48 PM) Javran: 不过我还确实没想到韩信点兵的说法
(11:37:22 PM) scturtle: 绕开 mod?我觉得像是 shouya 的解法
(11:37:24 PM) Javran: 感觉我这样有点event-based的意思
(11:37:49 PM) shouya_: 我的解法對不存在的 case 會陷入無窮查找
(11:37:50 PM) Javran: 我觉得这个还是不太一样的..
(11:37:57 PM) Javran: 我回去看看issue
(11:38:07 PM) shouya_: 不過如果用 ordlist 可以解決
(11:38:20 PM) scturtle: shouya 的如果可以扩展成 ordered 输出的话就没问题了
(11:38:39 PM) Javran: shouya的方法是先打表然后在里面找
(11:39:40 PM) scturtle: 我的想法是如果表打得好就可以顺序查找了
(11:39:47 PM) shouya_: 解法上是這樣子,我對那篇文章裡的 continuation 的方法很有興趣
(11:39:52 PM) Javran: 我觉得原文里那个向左的三角形貌似就是我们在issue里说的用""做失败的标记
(11:40:53 PM) Javran: 目前暂时在讨论第一个部分,后面会说到continuation的问题吧
(11:40:58 PM) shouya_: okay~
(11:41:28 PM) Javran: 对我来说不明白的问题是"jnformation flow structure"到底是什么个意思了
(11:41:39 PM) shouya_: 解法上的話,大概就是用到 semigroup 是基本性質
(11:41:40 PM) Javran: 不过我觉得这个问题可以留到最后讨论
(11:42:41 PM) Javran: 为什么这么说呢
(11:43:46 PM) scturtle: information 指的就是 "fizz" "buzz" "n" 这些吧,flow structure 指的是连起来的顺序关系?
(11:43:53 PM) Javran: 哦我大概知道什么意思了
(11:44:23 PM) Javran: jnformation flow指的是你既然已经输出一些东西,那再去检查结果是不是多余就没什么意思了
(11:45:20 PM) Javran: 或者说你原来因为mod 3 == 0的问题已经到了一个有信息的branch上,然后在原来的解法里又把这个信息丢掉了
(11:45:51 PM) Javran: 因为没有这个信息了所以只好再检查一遍""了
(11:46:05 PM) Javran: 我想过去应该是这么个意思
(11:46:24 PM) scturtle: 有道理,像 Exhibit B 那种
(11:46:27 PM) shouya left the room (quit: Quit: Bye).
(11:46:38 PM) Javran: 嗯
(11:46:42 PM) shouya [~shouya@li387-198.members.linode.com] entered the room.
(11:47:33 PM) shouya left the room (quit: Remote host closed the connection).
(11:47:35 PM) rink1969_: 嗯,从优化的角度看,就是不要有多余的操作
(11:48:09 PM) Javran: "if v then a else b", 在到达a的时候我们知道v是True,在到达b的时候我们知道v是False,我们在这两个branch都有基于context的额外信息,所以这个存在使用这个信息的可能
(11:48:25 PM) Javran: 嗯是的
(11:48:49 PM) Javran: 感觉第一部分差不多了吗?
(11:48:56 PM) rink1969_: 然后他说as modular as Exhibit C ,我理解是指容易扩展?比如像你们在issue里面的代码,又加上了一个11
(11:49:27 PM) scturtle: 是呢
(11:50:34 PM) Javran: 一般我理解modular大概想的就是如果把函数的定义视为黑盒的话,别人在别处使用这个函数的难易程度吧
(11:51:20 PM) scturtle: 这里是指扩展到 hiss howl 那些吧
(11:51:25 PM) Javran: 嗯对
(11:51:35 PM) scturtle: > let fizzbuzz n = case (n `mod` 3, n `mod` 5) of (0, 0) -> "fizzbuzz"; (0, _) -> "fizz"; (_, 0) -> "buzz"; _ -> show n
(11:51:36 PM) lambdabot: not an expression: ‘let fizzbuzz n = case (n `mod` 3, n `mod` 5) of (0, 0) -...
(11:51:39 PM) Javran: 我觉得可能这里就是扩展的容易程度吧
(11:51:45 PM) Tyler_Ling left the room (quit: Ping timeout: 246 seconds).
(11:51:55 PM) scturtle: > fizzbuzz n = case (n `mod` 3, n `mod` 5) of (0, 0) -> "fizzbuzz"; (0, _) -> "fizz"; (_, 0) -> "buzz"; _ -> show n
(11:51:56 PM) lambdabot: <hint>:1:12: parse error on input ‘=’
(11:52:07 PM) Javran: @let fizzbuzz n = case (n `mod` 3, n `mod` 5) of (0, 0) -> "fizzbuzz"; (0, _) -> "fizz"; (_, 0) -> "buzz"; _ -> show n
(11:52:08 PM) lambdabot: Defined.
(11:52:19 PM) scturtle: (」゚Д゚)」
(11:52:19 PM) Javran: scturtle: ok了,然后可以直接用的
(11:52:26 PM) Javran: :t fizzbuzz
(11:52:27 PM) lambdabot: (Show a, Integral a) => a -> [Char]
(11:52:35 PM) scturtle: > map fizzbuzz [1..15]
(11:52:36 PM) lambdabot: ["1","2","fizz","4","buzz","fizz","7","8","fizz","buzz","11","fizz","13","14...
(11:53:01 PM) rink1969_: fizzbuzz 15
(11:53:03 PM) scturtle: 这样其实也没有多余的运算,不过不好扩展
(11:53:10 PM) scturtle: > fizzbuzz 15
(11:53:12 PM) lambdabot: "fizzbuzz"
(11:53:19 PM) Javran: 嗯
(11:54:05 PM) rink1969_: 感觉从第一部分到第二部分有点跳跃
(11:54:33 PM) Javran: 那我们开始第二部分?
(11:54:37 PM) rink1969_: 你们有看扩展阅读部分么?那个SHP是怎么来的?
(11:55:04 PM) scturtle: 快一点吧,一会儿 GMT +8 的就吃饭去了
(11:55:12 PM) Javran: 那个SHP像一个中间语言吧,把数字"编译"成一个程序
(11:55:18 PM) Javran: 那个程序就是SHP
(11:55:52 PM) shouya_: 嗯,那個 DSL 比較有趣的地方是使用了 continuation monad
(11:55:58 PM) cjl_ left the room (quit: Ping timeout: 246 seconds).
(11:55:58 PM) rink1969_: 为什么要有skip指令呢?
(11:56:01 PM) Javran: 然后有一个观测是:SHP语言的解释器实际上是一个fold,于是作者把这个作为优化的契机了
(11:56:26 PM) Javran: 我想想有没什么SKIP的必要
(11:56:36 PM) Javran: 哦我知道了
(11:57:18 PM) Javran: 是这样子的,你需要一个不干任何事情的指令
(11:57:35 PM) shouya_: 類似 python 的 pass?
(11:57:47 PM) shouya_: 其實我也不太清楚 skip 的必要性?
(11:57:55 PM) Javran: 这样你从程序的context转回程序的时候你只要插回这个单位元就可以了
(11:58:00 PM) shouya_: 雖然沒有這個會少點東西
(11:58:21 PM) Javran: 哦,应该是零元
(11:58:25 PM) scturtle: 搁在最中间的占位符?
(11:58:30 PM) Javran: 嗯
(11:58:31 PM) rink1969_: 我觉得是不是针对这个问题才需要的?对应不满足替换条件时的“”
(11:59:15 PM) Javran: 我的理解就是为了让context随时能recover能程序用的
(11:59:29 PM) rink1969_: 把skip定义成print “” 是不是就不用这条指令了?
(03/17/2015 12:00:58 AM) scturtle: skip 没什么必要吧?就是象征那个黑点儿
(12:01:44 AM) rink1969_: 不是的,黑点是continuation
(12:02:36 AM) rink1969_: skip从抽象角度来说是零元,对应到这个具体问题就是打印空字符串
(12:02:46 AM) scturtle: "• is its left and right unit", 有这个就可以说这个 DSL 是 monoid 了……
(12:02:46 AM) rink1969_: 其实怎么理解都可以。。。
(12:04:01 AM) methou left the room (quit: Remote host closed the connection).
(12:04:10 AM) Javran: 嗯,效果上是没什么差别的吧
(12:04:19 AM) rink1969_: 其实最初的问题根本没提空字符串。
(12:04:35 AM) rink1969_: 我们在解决的时候,很自然就搞了一个空字符串出来。
(12:04:46 AM) Javran: 嗯
(12:05:01 AM) rink1969_: 看来群的思想其实还是挺自然的
(12:05:17 AM) Javran: 如果所有fizz/buzz/...合起来输出的东西还是空的话就是空字符串了
(12:05:49 AM) Javran: 嗯...总是觉得这些代数结构什么的到处都是
(12:06:30 AM) shouya_: 群的話,似乎沒有必要?
(12:06:46 AM) shouya_: 其實這樣想,continuation is a monad
(12:07:16 AM) Javran: 怎么又提到monad了
(12:07:21 AM) fishtreesugar: 不需要逆元吧
(12:07:23 AM) shouya_: monad 的 join 就是 monoid 的 mconcat 操作
(12:07:26 AM) Javran: 群可能确实没必要
(12:07:34 AM) Javran: <>和mzero就行了嘛
(12:07:42 AM) shouya_: 所以很類似
(12:08:10 AM) Javran: monad is just a freaking monoid in the category of endofunctors xD
(12:08:13 AM) rink1969_: 额,我只是说群的思想。没说这个问题是个群。
(12:08:23 AM) Javran: 嗯那是
(12:08:51 AM) Javran: 我觉得有"结合"这个操作和一个零元这样的结构就行了
(12:08:55 AM) Javran: 那个是monoid
(12:09:28 AM) Javran: SHP程序本身是monoid,因为SKIP的存在吧
(12:09:40 AM) Javran: 我觉得这也可能是引入SKIP的一个理由
(12:09:55 AM) scturtle: 觉得 SKIP 象征意义比较大
(12:10:01 AM) shouya_: 唔…應該可以這樣理解?
(12:10:16 AM) Javran: 我觉得不一定
(12:10:27 AM) rink1969_: 其实最自然的实现方式是Exhibit A。但是整个结构很不对称,不利于抽出子函数。所以就自动脑补一个空字符串(或者叫零元)上去,让结构变得丰满而对称。就可以抽象出更抽象的模式出来。
(12:10:29 AM) Javran: 如果你考虑Zipper的话,感觉就不太一样了
(12:11:07 AM) scturtle: 怎么又到 zipper 了
(12:11:15 AM) Javran: 把程序当作list,这样list zipper和程序的context就很类似了
(12:11:40 AM) Javran: zipper由当前的焦点和焦点外的context组成
(12:12:14 AM) Javran: 不过其实我们可以不关心焦点,只对zipper的context操作,,
(12:12:41 AM) Javran: 只是这么想想,我觉得同样是涉及context,这两个东西还是挺像的
(12:12:47 AM) scturtle: zipper 还要前前后后,这个只要顺序执行就好了吧,我觉得连 continuation 什么的都算不上,就是个简单的 DSL
(12:13:18 AM) Javran: 前前后后只是一种context的表示方法吧
(12:14:18 AM) fishtreesugar: Zipper不是数据结构话的continuation吗
(12:14:20 AM) Javran: 只是个离题的想法:要是zipper是(a,Context a)的话,我们其实能操作的不只是焦点,可以用文中类似的方法操作zipper的context
(12:14:25 AM) rink1969_: 是的,zipper跟context是有关系的。http://yi-programmer.com/2011-05-22_explain-algebraic-data-type.html
(12:14:51 AM) shouya_: 那麼用 zipper 的話這裡的 context 是怎樣的?
(12:15:05 AM) Javran: good job链接收下了
(12:15:30 AM) Javran: shouya_: 一样的
(12:16:15 AM) Javran: 你有没发现Cont是 \x -> [Print "fizz"] ++ x ++ [Halt]
(12:16:35 AM) Javran: [Print "fizz"]是左边[Halt]是右边
(12:17:31 AM) scturtle: 可你执行的时候要从最左边执行,zipper 你得一层层全解开才能执行第一句吧
(12:17:48 AM) fishtreesugar: The two views of zipper are dual: they both regard zipper as the context of a data structure traversal. That context can be rendered in the functional form (the suspension, the delimited continuation of a traversal) or in the defunctionalized form, as a data structure.
(12:17:57 AM) Javran: SHP的context不是composable的吗
(12:18:11 AM) Javran: 把context flatten了就只需要解一次了
(12:19:03 AM) Javran: fishtreesugar: 啊是就这个意思
(12:19:20 AM) Javran: 虽然我一直不是很明白dual是什么意思
(12:19:51 AM) fishtreesugar: http://okmij.org/ftp/continuations/zipper.html#introduction
(12:20:33 AM) Javran: 啊Oleg
(12:21:37 AM) Javran: 感觉聚会之后可以汇总一下share的链接,有没人愿意做一下的?
(12:22:09 AM) shouya_: 我應該可以?
(12:22:15 AM) Javran: ok
(12:22:52 AM) shouya_: 可能遲一些得去睡覺了,那麼其他人也可以繼續補充好了。
(12:22:57 AM) Javran: shouya_: 你写成markdown传repo去还是直接开wiki页面?
(12:23:07 AM) Javran: 那这样的话还是wiki好,大家都能编辑
(12:23:17 AM) shouya_: wiki 吧~
(12:23:26 AM) rink1969_: 加一个,最开始,讨论的数论相关的内容,matrix67有一篇很赞的博文。http://www.matrix67.com/blog/archives/5100
(12:24:06 AM) Javran: ok
(12:24:22 AM) Javran: 那行,我们接着讨论第二部分么?
(12:24:56 AM) Javran: 觉着这两个exercise应该还是挺直白的吧
(12:26:02 AM) Javran: 感觉这部分其实有个比较微妙的问题
(12:26:24 AM) Javran: 就是exercise之前的那个程序里 base n . fizz n . buzz n 这个顺序
(12:27:07 AM) Javran: 应该只有按这个顺序compose程序才会是对的
(12:28:09 AM) fishtreesugar left the room (quit: Ping timeout: 246 seconds).
(12:28:36 AM) scturtle: 嗯,不是很好看
(12:28:41 AM) Javran: 我在这地方是稍微思考了一下,读起来好像没什么问题,但是顺序只能是这样才对
(12:29:08 AM) rink1969_: 因为base不是尾递归的?
(12:29:25 AM) Javran: 我觉得关键是base里有一个HALT,不得不放到最前面去才有HALT的效果
(12:29:57 AM) rink1969_: 额,不对,这里没递归。就是base的hole不在最后
(12:30:07 AM) scturtle: 因为它定义的这个 DSL 的结构本来就很奇葩(
(12:30:19 AM) Javran: 哦我错了
(12:30:26 AM) Javran: 是fizzbuzz有HALT
(12:31:14 AM) Javran: scturtle: 可是我不太明白不自然的地方在哪里
(12:31:47 AM) Javran: 这个compose的顺序每次看到总得想一遍才知道是对的
(12:31:49 AM) scturtle: 你们不觉得这个 DSL 很难看吗,中心展开,要用 ++ 来构建,还有那么多 halt(
(12:32:30 AM) Javran: 我不觉得++构建是什么问题呀
(12:33:06 AM) rink1969_: 他那几个函数定义的不自然
(12:33:15 AM) scturtle: 因为 lazy 吗
(12:34:00 AM) rink1969_: 如果做一个cps变换,把continuation(hole)都放在函数的最后可能就感觉自然了
(12:34:27 AM) Javran: 我自己程序跑profiling大部分是lazy的问题,很少觉得++是什么瓶颈
(12:34:44 AM) rink1969_: 但是这样就不是组合关系,而是连续函数调用了
(12:35:07 AM) scturtle: 他要是能做成那个样子就不会写这么难看的 dsl 了吧(
(12:35:37 AM) Javran: 可能这地方得回去想jnformation flow的问题吧
(12:36:43 AM) Javran: fizz里面那个hole是知道fizz已经被输出了的
(12:37:08 AM) Javran: 总觉得这么说也不自然..
(12:38:44 AM) scturtle: 有 print 后面就得有 halt,最后才是 base,只能这样嵌套(还是觉得难看
(12:38:51 AM) Javran: 谁能试试按你们觉得更舒服的写法写会出现什么问题,我对CPS这部分不是很熟悉
(12:39:09 AM) scturtle: 和 cps 没关系吧(
(12:39:36 AM) rink1969_: 吃饭。。。顺便好好想想这个问题
(12:39:42 AM) Javran: 嗯
(12:40:03 AM) Javran: 那暂时先这样等下继续吗?
(12:40:25 AM) Javran: 我也去搞点夜宵好了(
(12:40:43 AM) scturtle: 那我也吃饭去
(12:40:50 AM) rink1969_: 把base里面的heol去掉,然后把fizz和buzz里面的halt去掉,就可以fizz。buzz。base了吧?
(12:41:48 AM) scturtle: 最好的写法是 [print fizz, print buzz, halt, print n] 但是没办法 compose 成这样(
(12:42:42 AM) Javran: 或许作者就是为了让结果出来是这个样子所以反推出来base / fizz / buzz要那么写的?
(12:43:17 AM) scturtle: 又要像这个样子,又要 compose,最后这么 ugly(
(12:44:31 AM) shouya_: 其實為甚麼需要 halt 不是很清楚
(12:44:47 AM) shouya_: 這裡的 halt 作用只是返回一個單位元嗎?
(12:45:42 AM) Javran: halt是很重要的呀
(12:45:51 AM) Javran: halt也是人类的好朋友呀
(12:46:08 AM) Javran: 没有halt的话后面的print就会输出来了
(01:04:00 AM) methou [~methou@159.226.118.47] entered the room.
(01:05:22 AM) haisheng left the room (quit: Quit: ERC Version 5.3 (IRC client for Emacs)).
(01:05:44 AM) shouya_ left the room (quit: Quit: WeeChat 1.1.1).
(01:32:32 AM) xiaolin [~xiaolin@137.116.170.133] entered the room.
(01:32:59 AM) xiaolin: hello?
(01:34:43 AM) Javran: xiaolin: hi
(01:35:51 AM) Javran: 有些人吃饭去了所以稍微休息一下
(01:39:18 AM) Javran: 现在有多少人在这的说句话
(01:43:47 AM) rnons [~rnons@184.75.250.215] entered the room.
(01:44:37 AM) Javran: 都回来了没?
(01:49:11 AM) scc [~shoucheng@125.122.209.16] entered the room.
(01:50:17 AM) methou: 我旁听。
(01:50:26 AM) Javran: 唔...
(01:50:36 AM) Javran: 刚才出去吃饭的同学们呢
(01:51:19 AM) Javran: 刚才那堆东西旁听起来有啥感想么xD
scc scturtle
(01:53:17 AM) Javran: rink1969_: scturtle: ping
(01:55:54 AM) Javran: 要不现在有谁新开个话题继续讨论好..
(01:56:22 AM) rink1969_ left the room (quit: Ping timeout: 246 seconds).
(02:10:15 AM) rink1969 [2a784b03@gateway/web/freenode/ip.42.120.75.3] entered the room.
(02:10:31 AM) Javran: rink1969: 继续?
(02:10:36 AM) rink1969: 回来了。。。跑出去比较远吃饭。。
(02:10:43 AM) Javran: 吼啊
(02:10:47 AM) rink1969: 好的
(02:11:05 AM) Javran: shouya好像机子没电了
(02:11:24 AM) Javran: 其他人ping了没反应,所以暂时有点尴尬
(02:11:42 AM) Javran: anyway先这样继续好了
(02:11:55 AM) scturtle: 有个砖要搬,你们先聊着,我偶尔插两句……
(02:12:01 AM) rink1969: 好吧
(02:12:05 AM) Javran: 哦这个意思
(02:12:07 AM) Javran: k
(02:12:22 AM) rink1969: 吃饭前那个问题有什么进展么?
(02:12:26 AM) Javran: 来我们讨论下接下来有搬的部分
(02:12:38 AM) Javran: 没什么成果
(02:13:09 AM) Javran: 可能要实现一下才知道具体会有什么问题吧,那个compose还是觉得很奇怪
(02:14:16 AM) Javran: 吃饭的时候有什么新的灵感么
(02:15:03 AM) rink1969: 额,没有。只顾着看浙大的学生妹了^_^
(02:15:21 AM) Javran: 吼啊,这个中央也兹磁啊
(02:16:13 AM) Javran: 那这个部分就这么放着好了
(02:16:42 AM) Javran: 接下来的部分我觉得就是"interpretation is a fold"了
(02:17:28 AM) rink1969: base肯定是跟fizz和buzz不一样的,因为后面两个有可能是组合的,但是base跟这两个是互斥的
(02:18:04 AM) Javran: 嗯
(02:18:34 AM) Javran: 我一开始还奇怪这语言怎么没有branch
(02:18:57 AM) Javran: branching被提前到"compile"阶段了
(02:19:31 AM) Javran: 突然在想这就是把information flow考虑进去的结果吧
(02:19:50 AM) rink1969: 是的,fizz和buzz的otherwise是一条pass路径,直接到最后base那里print n
(02:19:57 AM) Javran: 嗯是呀
(02:20:22 AM) rink1969: 另外一个分支里面那个hole是为了把fizz和buzz组合起来
(02:20:31 AM) Javran: 但是一旦进了fizz buzz的yes分支,那就一定要有个halt,在print n之前
(02:20:31 AM) methou left the room (quit: Remote host closed the connection).
(02:20:37 AM) rink1969: 后面一定要有halt,因为base不能组合进来
(02:20:42 AM) Javran: 嗯
(02:20:44 AM) rink1969: 是的
(02:21:51 AM) Javran: 这个程序优化到最后可能剩下的就是 scturtle 说的 [print "fizz"; print "buzz"; halt; print n]这样的东西了
(02:22:35 AM) Javran: 我的想法是作者可能就是根据最后的结果逆推成那个样子的
(02:23:01 AM) Javran: 可能存在更decent的方法,不过目前这个方法看着有点奇怪不过能用
(02:23:23 AM) rink1969: 是的,SHP知识targe语言,base等函数其实不是用SHP定义的,因为里面有mod判断
(02:23:42 AM) Javran: 可能fizz和buzz后面都要一个halt的原因就是保持context之间能compose
(02:24:25 AM) Javran: 嗯
(02:25:20 AM) Javran: 感觉这个部分差不多了吧
(02:25:27 AM) rink1969: 嗯
(02:25:43 AM) Javran: 接下来就是那个fold了我觉得?
(02:26:04 AM) rink1969: 好的
(02:26:38 AM) Javran: 说实话这部分我是跳着看的,好像就是些symbol pushing
(02:26:47 AM) Javran: 我仔细过一遍
(02:28:32 AM) Javran: 首先是这个step函数
(02:28:34 AM) rink1969: 我这块儿也没看的很仔细
(02:28:55 AM) Javran: 我觉得type signature的正确读法是Cmd -> (String -> String)
(02:29:01 AM) rink1969: 之前看过spj1982那本函数式编程语言实现的书,感觉差不多
(02:29:03 AM) Javran: cmd直接变成对应的函数
(02:29:21 AM) Javran: 啊那个我没看过呢
(02:29:55 AM) Javran: 怎么这边有相关内容吗?
(02:30:28 AM) rink1969: 额,就是解释器的实现都差不多吧,似曾相识,所以就没仔细看
(02:30:38 AM) Javran: 对了interpret那个部分 scturtle 之前说可能和free monad什么的相关,能具体说说不?
(02:30:43 AM) Javran: 哦哦哦
(02:30:49 AM) Javran: 我是说fold那个部分
(02:31:15 AM) scturtle: 我的意思和你说 zipper 那边差不多吧
(02:31:21 AM) Javran: 我觉得这个semantic翻译过来还是挺直接的
(02:31:30 AM) rink1969: 是的,有一种解释器的实现叫什么tagless 的
(02:31:33 AM) Javran: scturtle: ok
scc scturtle
(02:31:42 AM) rink1969: 跟free monad相关
(02:31:45 AM) Javran: finaly tagless?
(02:31:49 AM) Javran: oleg那个?
(02:31:53 AM) rink1969: 但是这块儿我也没理解
(02:31:59 AM) rink1969: 是的
(02:33:17 AM) Javran: 这个除非有人能直白点说一下free monad是啥,否则我是不太搞得懂的
(02:33:19 AM) scturtle: http://dev.stephendiehl.com/hask/#free-monads 第二个 Interaction 那个例子
(02:33:41 AM) Javran: 似乎就是把join延迟的monad,个人稍微看了一下的话
(02:34:32 AM) xiaolin: which encoding?
(02:35:00 AM) xiaolin: a lot of question marks here ...
(02:35:20 AM) Javran: 具体说说?
(02:35:53 AM) Javran: 似乎都看过又似乎都没仔细看过(叹气
(02:36:25 AM) xiaolin: 你好
(02:36:32 AM) xiaolin: 可以看到么?
(02:36:36 AM) xiaolin: ..
(02:36:38 AM) Javran: 嗯
(02:36:56 AM) rink1969: 嗯,我看过free monad的wiki。但是无论如何都无法把数学上的性质跟其用途联系起来。。
(02:37:13 AM) rink1969: 脑力不够啊。。。
(02:37:19 AM) Javran: 可能需要一点例子吧
(02:37:28 AM) Javran: 这个任务我来做好了?
(02:37:38 AM) Javran: 正好我也想研究一下free monad
(02:37:39 AM) xiaolin: /set term_charset utf-8
(02:37:54 AM) xiaolin: /set recode_autodetect_utf8 ON
(02:38:30 AM) Javran: xiaolin: 你那个客户端命令没给识别出来
(02:38:43 AM) Javran: 要不就先用网页版登吧
(02:38:45 AM) scturtle: :i Free
(02:38:48 AM) xiaolin: I am using irss ... :(
(02:38:56 AM) xiaolin: s/irss/irssi/
(02:38:58 AM) Javran: 我觉得好像不兹磁:i
(02:39:03 AM) scturtle: >:i Free
(02:39:08 AM) Javran: @hoogle Free
(02:39:10 AM) lambdabot: package FreeTypeGL
(02:39:10 AM) lambdabot: Foreign.Marshal.Alloc free :: Ptr a -> IO ()
(02:39:10 AM) lambdabot: package free
(02:39:16 AM) Javran: WTF
(02:39:26 AM) xiaolin left the room.
(02:39:32 AM) xiaolin [~xiaolin@137.116.170.133] entered the room.
(02:39:37 AM) xiaolin: OK ..
(02:39:42 AM) xiaolin: ????...
(02:39:51 AM) ***scturtle data Free f r = Free (f (Free f r)) | Pure r 手打好了
(02:39:52 AM) Javran: xiaolin: zfmele
(02:39:55 AM) Javran: 怎么了
(02:40:33 AM) scturtle: data Free f r = Free (f (Free f r)) | Pure r 里面 r 就是 continuation……
(02:40:46 AM) Javran: scturtle: 好像是说递归的数据结构都可以转成这个表示么?
(02:41:10 AM) rink1969: http://stackoverflow.com/questions/13352205/what-are-free-monads
(02:41:28 AM) scturtle: 嗯,我是这样觉得
(02:41:29 AM) scc left the room (quit: Ping timeout: 272 seconds).
(02:42:34 AM) rink1969: A free monad satisfies all the Monad laws, but does not do any collapsing (i.e., computation). It just builds up a nested series of contexts.
(02:42:58 AM) rink1969: 但是我感觉这个跟free monad的free没什么关系啊?
(02:43:11 AM) scturtle: 这个文章里不也是 build up 再 interp
(02:43:41 AM) scturtle: 而且 list 本来也是递归定义的
(02:43:48 AM) scturtle: 一个想法,不一定对(
(02:44:16 AM) rink1969: free不是说一个代数结构可以通过遗忘算子变成一个set么?
(02:44:38 AM) Javran: 不过话说forgetful functor到底是什么
(02:44:45 AM) scturtle: O_O?
(02:45:06 AM) rink1969: 难道是说interpreter把[cmd] 变成语法树?
(02:46:13 AM) Javran: list 就是一个tree吧
(02:46:17 AM) scturtle: http://dev.stephendiehl.com/hask/#free-monads 里那个 IO free monad,你们看 data Interaction 和后面的 interp 不是和这篇文章很像吗(
(02:47:03 AM) Javran: 看来真是相当有关系的文章呢
(02:49:09 AM) Javran: step是把Cmd转成了String->String, interp = foldr step "" 就是执行了
(02:50:00 AM) scturtle: DSL 写成 free monad 是很漂亮的,因为可以用 do notation,但是 free monad 构建时必须顺序来,对 halt 来说就不行,所以我觉得有点 ugly(一个想法,不一定对)
(02:51:36 AM) Javran: 我仔细看过interpretation is a fold 那部分了,看来天下的composition顺序从来都不统一 (叹气
(02:52:52 AM) scc [~shoucheng@125.122.209.16] entered the room.
(02:53:23 AM) Javran: context从右到左结合了,执行却是从左到右的
(02:54:24 AM) rink1969: free monads那篇文章里面的例子更复杂,每条cmd的类型都不同
(02:54:56 AM) rink1969: 这篇文章的比较简单,cmd都是string->string的
(02:55:03 AM) Javran: foldr (.) id (fmap step p) "" 或许可以直接写成 (foldMap step) "", 如果实现了相应的Monoid的话 (一个想法,不完全不对)
(02:55:06 AM) rink1969: 所以直接foldr就可以了
(02:56:32 AM) Javran: :t foldMap
(02:56:33 AM) lambdabot: (Monoid m, Foldable t) => (a -> m) -> t a -> m
(02:57:11 AM) Javran: 因为之前证过那东西就是monoid了.
(02:57:57 AM) Javran: 觉得再研究研究free monad还是把后面那部分过一下?
(02:58:51 AM) scturtle: continue 吧
(02:59:24 AM) rink1969: 嗯,先继续吧。free monad有空在慢慢看一下
(02:59:29 AM) Javran: 好的
(02:59:47 AM) Javran: 刚才聊哪了
(03:00:11 AM) Javran: 再下来就是些inlining和final polishing了貌似?
(03:00:47 AM) scturtle: 感觉就是简化简化又回到原点了(
(03:01:01 AM) Javran: 嗯是
(03:01:18 AM) Javran: 抽象完了跑不回实际就蛋疼了
(03:02:27 AM) Javran: 哦这又有三个exercise
(03:03:28 AM) Javran: 我觉得后面似乎就没啥意思的样子了(
(03:03:35 AM) scturtle: 对(
(03:05:15 AM) Javran: 这样吧,还有些时间我们讨论下下次的话题?
(03:05:55 AM) scturtle: 一个想法不一定对:一开始非要把 fizz buzz 和 base 搁在一块 compose,搞的很复杂,最后还是特么分来了,光考虑 fizz buzz 的 composition 最后再考虑 base 就简单多了(
scc scturtle
(03:06:43 AM) Javran: 我觉得 scturtle说的队!
(03:07:48 AM) Javran: issue 1里看最简单的写法其实也就是这么做的
(03:08:20 AM) scturtle: 另一个想法:像 ninegua 那样用 either 来区分两种运算很不错,ninegua 老师能进一步抽象成 monoid (虽然也不是特别完美)也很有功力
(03:09:07 AM) Javran: 你这么说看懂了
(03:09:20 AM) scturtle: 说错了 semigroup……
(03:09:23 AM) Javran: Left和Right是两条线
(03:10:07 AM) scturtle: 我觉得本质是这样,分两条线就好 compose,ninegua 那些思想我就不奢望现在看懂了(
(03:10:31 AM) Javran: 我觉得就是要让那些东西更comfortable一点呀
(03:11:05 AM) Javran: 搞懂自己到底哪里搞不懂了也是技术活(
(03:11:48 AM) Javran: 行吧,有没想法讨论一下接下来的文章
(03:12:08 AM) Javran: 因为supercompliation有点长我想分多次
(03:12:49 AM) Javran: 我不是指文章内容,我的意思是觉得看到什么地方没问题,我们下次就讨论在那之前的
(03:12:57 AM) scturtle: 下一个 Practical Type System Benefits?
(03:13:12 AM) Javran: 等等我看看我不确定
(03:13:27 AM) Javran: 啊对对对
(03:13:31 AM) Javran: 我记错了
(03:13:55 AM) Javran: 那这个还行
(03:14:55 AM) scturtle: 感觉是篇安利文,随便聊聊就可以了吧(
(03:15:28 AM) Javran: 我就length xs了一下,没看过内容(
(03:16:02 AM) Javran: 随便聊聊也行吧反正,我觉得主要有这讨论的气氛就不错了
(03:16:27 AM) Javran: <-没有追求
(03:16:39 AM) scturtle: 人很多,怎么都不说话呢(
(03:16:41 AM) ***Javran 叹了口气
(03:16:53 AM) ***Javran 表示不知道为什么
(03:17:07 AM) ***scturtle 吐了个槽
(03:17:12 AM) rink1969: 啊,我就上了个厕所,回来就结束了。。。
(03:17:20 AM) Javran: 哦没有没有
(03:17:27 AM) Javran: 只是这文章感觉差不多了
(03:17:33 AM) Javran: 剩下的时间自由讨论吧
(03:17:38 AM) ninegua [47ed8627@gateway/web/freenode/ip.71.237.134.39] entered the room.
(03:17:56 AM) rink1969: 大师来了。。。
(03:17:57 AM) Javran: 我觉得以后时间得定短一点,我这tm 3点了
(03:18:07 AM) Javran: ninegua: 九瓜老师好!
(03:18:20 AM) ninegua: sorry, 来晚了...
(03:18:40 AM) ninegua: 刚才花了三个小时装桌子...
(03:18:57 AM) rink1969: 。。。
(03:19:10 AM) ninegua: irc 有没有看之前记录的功能?
(03:19:11 AM) Javran: 啊没事,我们这差不多过了一遍内容吧,现在正准备搞点自由讨论
(03:19:19 AM) Javran: 这个群没有记录
(03:19:24 AM) Javran: 我不知道怎么搞(
(03:19:44 AM) scturtle: 有没有那种记录的 bot(
(03:19:53 AM) Javran: 不懂和#haskell里的人说说他们能否给帮提供一个记录功能
(03:20:34 AM) Javran: 能直接用ircbrowse加个能记log的bot就最理想了吧
(03:21:05 AM) scturtle: botbot.me ?
(03:21:47 AM) rink1969: 大家觉得他整个文章的思路常用么?
(03:22:39 AM) rink1969: 搞个DSL,然后解释器,然后优化,绕了一圈,搞了一个普通的程序出来。。
(03:22:47 AM) Javran: 我是没用过类似的东西
(03:23:10 AM) ninegua: 可以看看 Bird 的书
(03:23:18 AM) ninegua: 还是有些类似的
(03:23:21 AM) scturtle: 我们刚刚讨论原文把 fizz buzz 这种运算和都不满足时 show n 放在一起 compose 比较麻烦,ninegua 老师的 either 就能很好地区分这两种的不同,不知道理解的对不对?
(03:23:59 AM) Javran: 嗯,刚才一个问题是觉得base/fizz/buzz那几个东西的定义有点奇怪
(03:25:06 AM) Javran: 还有那个interpret和free monad的联系之类的
(03:29:05 AM) rink1969: test
(03:30:05 AM) Javran: ping!
(03:30:14 AM) Javran: 怎么突然安静了..
(03:30:17 AM) scturtle: echo
(03:30:17 AM) ninegua: 原文的做法基本上是用 x "" 来做选择
(03:30:32 AM) ninegua: sorry, 刚刚有事不在
(03:31:40 AM) Javran: x "" ?
(03:33:24 AM) ninegua: 对啊,x 为 id 时,就能够保留show n
(03:33:51 AM) Javran: 哦这个意思
(03:34:31 AM) ninegua: 说错了,x "" 把 show n 干掉了
(03:34:57 AM) ninegua: 另外一种情况是 id,留住了 show n
(03:34:58 AM) Javran: 我把x看成乘号了刚才
(03:35:30 AM) ninegua: 所以和 either 的做法其实差别不大
(03:35:32 AM) Javran: 感觉step函数说的就是三个指令的函数形式
(03:36:26 AM) ninegua: 差不多是这个意思吧
(03:37:19 AM) ninegua: free monad 我觉得是用来得到 abstract syntax tree
(03:37:46 AM) rink1969: 哦
(03:38:06 AM) Javran: 那这里的AST就是[Cmd]吗?
(03:38:11 AM) ninegua: 文章里面的 DSL 就只有一种线性结构
(03:38:21 AM) ninegua: 对
(03:39:09 AM) Javran: 如果说是用来得到AST的话,那就是数字转Program的过程中使用的吗
(03:39:19 AM) rink1969: 那个分支没有定义在dsl里面
(03:40:51 AM) ninegua: @Javran 不太明白你的意思
(03:40:51 AM) lambdabot: Unknown command, try @list
(03:41:40 AM) Javran: ninegua: 我的意思是说我不知道要是这个地方用free monad的话该怎么用
(03:42:00 AM) ninegua: 有点 overkill,因为不是个 tree
(03:43:27 AM) rink1969: 话说,base fizz buzz的定义,好像是从Exhibit C直接转换来的
(03:43:28 AM) Javran: 怎么去理解"用来得到AST"这个说法呢?要是拿这个SHP语言做例子的话
(03:43:56 AM) ninegua: 如果一定要用,就先把搞成 Cmd a = Skip a | Halt a | Print a
(03:44:28 AM) ninegua: Print String a
(03:46:15 AM) Javran: 感觉我要自己去实现了试试
(03:47:11 AM) ninegua: rink1969 我也不太清楚原作者是怎么能够联想到 Skip/Halt/Print 这种 DSL
(03:48:01 AM) rink1969: 嗯,感觉这篇文章的思路不是很连贯,有些地方跳跃太大了
(03:48:10 AM) Javran: 我也不知道为什么跑出这个东西来了...分支还是在"编译时"确定的
(03:49:01 AM) ninegua: 文中定义 fizz buzz base 这些,都算是 higher order program 吧,因为要利用”大黑点“ 这种 context 的标记
(03:49:13 AM) Javran: 要来个If Bool (Cmd a) (Cmd a)之类的free monad就有用了吧
(03:49:26 AM) scturtle: 我们刚才讨论的是作者可能想的是 [print "fizz", print "buzz", halt, print (show n)] 这种样子,用 halt 来阻止 show n
(03:49:26 AM) ninegua: 怎么样也不算是 conventional 做法
(03:50:30 AM) rink1969: 是的,fizz buzz 和base这三个函数其实是代码生成器
(03:51:14 AM) ninegua: scturtle 有道理
(03:52:22 AM) rink1969: 他们的类型是 fizz , buzz , base :: Int → Cont
(03:52:47 AM) Javran: ㄟ差不多时间了..我准备休息去了
(03:53:03 AM) Javran: 挂着机记聊天记录
(03:53:20 AM) ninegua: Cont 的定义就是个 program transformer
(03:53:23 AM) rink1969: 好的,美国那边的同学辛苦了。。。
(03:53:35 AM) ninegua: 东岸的幸苦了!
(03:53:52 AM) Javran: 啊没事没事
(03:54:04 AM) Javran: 感谢大家捧场了,比想像中的好很多!
(03:54:33 AM) rink1969: 嗯,是的,所以条件判断是在元编程的层面做的,不同条件,生成不同的SHK指令序列
(03:54:43 AM) ninegua: 下一篇要读 supercompilation 了吗?期待!
(03:55:02 AM) Javran: 好像不是...
(03:55:09 AM) ninegua: ...
(03:55:25 AM) Javran: Practical Type System Benefits这个
(03:55:49 AM) Javran: 然后下一个才是supercompliation
(03:55:50 AM) ninegua: oh
(03:57:20 AM) Javran: 先这样好了,休息去..接下我挂机了
(03:57:48 AM) Javran: 最后感谢一下大家,多来这频道玩&参与github上的讨论 xD
(03:57:59 AM) rink1969: continuation其实就是指令序列里面的一个洞,通过合理排列指令序列,就把Exhibit C中多余的那次判断给消除掉了?
(03:58:26 AM) rink1969: 感觉跟supercompilation有点关系哦
(03:59:30 AM) ninegua: 这个例子里面需要的 continuation 其实就是最终返回结果之前需要做一个选择
(04:01:31 AM) ninegua: 可以推导出 Halt 要么不出现,要出现总是出现在倒数第二个位置
(04:07:49 AM) scturtle left the room (quit: Quit: ZZZzzz…).
(04:10:25 AM) ninegua: 我也先下了!
(04:10:38 AM) ninegua left the room.
(05:47:46 AM) ***jokester continues to read the prelude of learnyouahaskell
(06:29:44 AM) rink1969 left the room (quit: Ping timeout: 246 seconds).
(07:46:32 AM) rnons left the room (quit: Ping timeout: 264 seconds).
(08:14:50 AM) jokester left the room (quit: Quit: nirvana).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment