-
-
Save Javran/2617860a16cd05e576f1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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