Bar

1
2
3
4
5
import "blog.formalscience.com/nothing"

func main() {
nothing.bar()
}

I dreamed about death this morning.

I dreamed about false dreams this morning.

I woke up tired.

I made some coffee with milk or without milk.

I saw some videos on Youtube and Bilibili.

I wrote this blog.

我一生的故事

我一生的故事
我终于去看了《降临》。最初知道 特德·姜/Ted Chiang 的《你一生的故事 /Story of Your Life》要被搬上银幕的时候,我内心很激动,因为这是我非常喜欢的一篇科幻小说。不过担忧也是有的,很多科幻小说以电影的形式展现时,感觉上总是有些残缺,或囿于电影技术,或囿于艺术表现形式,或者就是书的读者有不切实际的期望。

再次听说相关消息时,已经是在美国上映的消息了,影片名称是《降临》,相比原书的标题这个名称显得更加科幻一些。然后听说到的就是各种好评,我本来期待着北邮人上什么时候会有下载资源,因为感觉国内没可能上映了。后来知道的就是上映的消息,直到今天观影结束。

我相信关注一些电影公众号的人肯定已经被剧透了,在此我就不再描述剧情了。对于我来说,看过中文版的小说,又看了英文版的小说,然后看了电影。在已经知道了剧情的前提下看电影,和已经知道了未来的人生的前提下继续生活有些相似之处。不过我头脑仍然只能处理从过去向未来流动的线形时间,而不是书中/电影中的 没有方向的文字。

语言真的可以影响人的思考方式吗?

作为《你一生的故事》理论基石的是语言相对性原理(萨丕尔-沃夫假说)。这是一个关于人类语言的假说:

认为不同语言裡所包含的文化概念和分类会影响语言使用者对于现实世界的认知,也就是说不同的语言的使用者会因语言差异而产生思考方式,行为方式的不同。

七肢桶(书中外星人因其外形得到的称呼)的文字是非线形的文字,复杂的文字在简单的文字之上通过改变结构得到,它们在表达一个思想之前就获得了这个思想对应文字的全部形状。同样对于它们来说,复杂的物理学定律,特别是人类目前没有掌握的关于时间空间的部分,比基础的牛顿定律来说更容易理解。光为什么沿着时间最短路径行进?我们可能需要量子理论来计算光行进所有可能路径然后对每一条路径进行积分算出其概率。对于七肢桶来说,光沿着最短路径行进就是其目的。

每个文明的科技进展路线和其环境有很大关系,一个内陆国家是发展出强大航海科技的可能性是很小的。对于七肢桶来说谈论过去和未来是没有意义的,它们只是向着目的前进。(即使这个“目的”在“未来”发生)也许这是看待世界的两种方式,就像在在时域和频域对一个信号进行不同的观察。

女主角在和七肢桶接触以及学习了其文字 —— “七文” 后,逐渐领悟了自己的未来。电影或书中出现未来的地方就容易出现矛盾。特别集中在人知道了未来之后能否改变未来这一问题上。有一种观点认为预知未来和自由意志之间只能二择其一。女主角在学习文字语言的过程中,到底是获取了预知未来的能力,还是放弃了自由意志?

预知未来的人不会奢谈未来,读过岁月之书的人不会承认自己读过它。
—— 《你一生的故事 /Story of Your Life》 特德·姜/Ted Chiang

人们讴歌自由意志,然而又同时梦想可以预知未来。
—— 《我一生的故事》 乱说话的跳跳 / Bef0rewind

女主角在知道自己女儿将来会因为罕见病去世之后,依然(此处用选择或者决定都不合适)生下了她。后来她把自己对未来的预知告诉丈夫后,丈夫对她的行为感到愤怒,他们的婚姻也结束了。

对于电影中出现的一个小高潮,商将军告诉女主角自己的私人号码。有人质疑,女主角既然能够看见未来,为什么需要在未来的商将军告诉她这一信息。也许语言对她的影响是逐步产生的,未来的画面满满展开在了她面前,而在此刻她注定不知道这一信息。未来的商将军也受到了 “七文” 的影响,对女主角说:你应该(should)给我打电话。

书中最后没有提到七肢桶来到地球的目的,电影中给出了一个目的:三千年后七肢桶需要人类的帮助(它们在未来里看不到自己的目的了吗?)。电影中女主角对七肢桶的文字出版了教科书,讲授相关知识,也许会对地球人的思维产生影响吧。我也想过,七文会主导世界吗,地球人也会出现某种进化吧。好多语言会消失啊,对应的文明也消失了吧。

我讲过的两段话:

时间旅行故事中最美妙的因素就是时间。我在过去种下一颗种子,现在收获了一棵大树。

一个能够沿着时间轴前进后退的生命和一个只能单向前进的生命,哪个更有趣?前者已知所有,后者并不知道未来。如果前者眼中时间是一条线段(端点可能在无穷处),线段两端是其诞生和终结,可能还是对前面是否有尽头的未知有意思一点。

在英剧《奇异博士》五十周年特别篇 The Day Of The Doctor 中,三代博士使用的是同一个计算终端。当最老的博士在他的终端启动了计算,到了第三代博士手中的终端就处于计算了几百年之后的状态,得到了计算结果。

时间,只有时间。


我如果在书中,会是一个什么角色呢?我会有什么样的行为?作为一个希望与外星智慧生命接触的人,如果真有外星飞船降临,我得不到与它们见面的机会,毕竟我不是有特殊技能的人士。除非我是男主角,那外星生命可能出于某种目的同我接触。

有一点特别感动,父母会走到生命的尽头,孩子也会。我想到自己未来的孩子,我与你的故事,我会成为一个怎样的父亲,也许很久之前我就知道了呀。


一些相关的科幻小说

《与拉玛相会/Rendezvous with Rama》 阿瑟·克拉克/Arthur C. Clarke

一艘外星飞船从地球附近飞过,人类登陆上去后除了发现了高级自动机器人外,对于是否有智慧生命控制飞船以及其目的仍旧一无所知。最后随着飞船离地球远去,留给人类的只是一个谜。人是多么渴望自己有邻居,然而这个邻居确毫无回应地走了。

《海伯利安/Hyperion》丹·西蒙斯/Dan Simmons

这是一个背景宏大的故事,我们未来是否能够与人类的创造物(AI)和平共处?爆发战争的话,双方都要穿越时空传送回战力进行决斗。如果有更高级的生命,人类被其接纳的条件是什么?需要超越肉体形态,或者和 AI 进行合体产生新的生命吗?是否要保持人类的纯粹,还是对自身进行改造,适应地球之外的环境,在未来更广阔的世界中进化?

《永恒的终结/The End of Eternity》艾萨克·阿西莫夫 /Isaac Asimov

当人类获得了延时空旅行的能力,对历史(时空井建成之后)中的“错误”进行修正。未来的某段时间区间的人封闭了自己所在的区间,主角所在的永恒时空组织没有能力进入。当主角碰到了封闭时空区间段内的女主角时,对于爱情和永恒的领悟使他做出了最终的修正——毁掉时空井。通过修改过去对历史填补,也可能会把人类逼到死路——使人类生活于安逸的时代,错失向外太空进发的动力与机遇,而宇宙中不只有地球人。

《童年的终结/Childhood’s End》阿瑟·克拉克/Arthur C. Clarke

当更高级的文明降临地球,接管地球的管理,禁止战争,提升科技,人类对于国家的认识和生活方式也发生了改变。同时发生改变的还有地球上的孩子,他们不和父母交流,不接受地球的文明,并且拥有了控制物质的能力。当向往外星文明的扬回到地球后,发现十岁之下的还在都已经是这种状态了。原来高级文明是接受了更高级文明的委托,监督引导人类的进化过程。最后所有孩子分解了地球,一起融入了更高级的文明。人类文明是别人的猎物吗?还是获得了进化?无论怎样,这都是人类文明的终结。而监督地球的高级文明没有融入更高级文明的可能性,他们被困住了。这是一种幸运还是悲哀呢?他们不会有理解

《时间回旋/Spin》罗伯特· 查尔斯·威尔森/Robert Charles Wilson

这是一部在技术和人文上都独具匠心的作品。末世的希望,末世的绝望。超级生命帮助人类制造了时间膜,地球一年,外面一亿年。太阳四十二亿年后是会毁灭的,人类的希望是利用进化的力量向火星运送生命,期待时间带来的科技进步能够拯救人类自身。而火星的同胞最终发展的生物科技到底给人类带来了什么?当太空中百万年才产生下一代的机械生命和人类哪个更 “高级”(生存下来才是王道)?机械生命之间的吞并战争更加残酷。更高级的文明拯救低级文明的目的是什么?融入更广阔的智慧是一种选择,哪怕失去了 “我” 的意识。时间,只要有了时间,一切都有可能。

《宇宙尽头的餐馆/The Restaurant at the End of the Universe》道格拉斯·亚当斯 /Douglas Adams

如果你想在欢乐中感受科幻的魅力,这部充满英式幽默的小说绝对不能错过。在时间尽头来回游荡,发生的趣事一桩接一桩。此外如果对宇宙中一切问题的终极答案感兴趣,《银河系搭车客指南》不容错过。不过我也可以告诉你答案,是 42 哦。

还有很多小说,我想不起来了。

We write to taste life twice in the moment and in retrospect.
— Anaïs Nin

Ingress_Passcode_自动提交

什么是 Passcode?

根据 Ingress 中文游戏指南 的讲解,Passcode 是 Ingress 提供的一种奖励。

使用 Investigation Board 来了解 Ingress 的最新剧情并寻求对 Niantic Project, NIA, XM, Shapers 以及各阵营不同问题的答案。 可以使用隐藏在这些报告之中的 Passcode 来兑换道具(Resonator,XMP 等),XM 或者 AP。

另外,一些官方活动会向到场者赠送包含 Passcode 的卡片,特定的官方周边也会赠送此类卡片。卡片上的 Passcode 一般能够兑换活动徽章。

注:在很多社交网站上可以找到有效的 Passcode

在 iOS 平台的 Ingress 客户端上 Passcode 兑换功能不可用,因此只能使用 Intel Map 来兑换。

在 Intel Map 上兑换

  1. 在右上方点击 Passcode
  2. 输入你的 passcode,然后点击 SUBMIT 兑换

自动化 Intel Map 兑换过程

可以通过浏览器的调试页面,自动将搜寻到的 passcode 提交,进行物品兑换。

  1. 表单提交

    1
    document.getElementById("redeem_reward_form").submit();

    不能正确提交表单失败的原因是这个表单的 input 元素名称就是 submit,需要重命名。

    1
    2
    3
    4
    5
    var field = document.getElementById("chicken");
    field.id = "horse"; // using element properties
    field.setAttribute("name", "horse"); // using .setAttribute() method
    document.getElementById("chicken").setAttribte('name', 'horse');
    document.getElementById("redeem_reward_form").submit.setAttribute('id', 'submit_code')

    这些都不太管用,应该是 form 之前的 submit 属性已经被设置了,改了名字也不能绑定 submit 方法了。:|

    有效的代码:

    1
    document.getElementById("redeem_reward_form").submit.click()
  2. 每隔一段时间自动提交一个 passcode

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var codes = ['DEADDROP7DT73AM6'];   //Here put the number of times you want to auto submit
    var count = 0;
    (function submitPasscode(){
    if(count >= codes.length) return;
    document.getElementById("redeem_reward_form").passcode.value = codes[count];
    document.getElementById("redeem_reward_form").submit.click();
    count++;

    setTimeout(submitPasscode, 3000 + Math.floor((Math.random() * 500) + 1);); //Each second
    })();
  3. 增加一个输入窗口,用来输入获得的 Passcodes

    Passcode 收集过来后一行一行整理好:

    1
    2
    3
    4
    5
    6
    7
    ada3zc36qq9
    ada9yv83mp5
    algorithm9ek27ux3
    algorithm9gh35cj3
    artifact3ne73hh3
    bletchley9ob65ca4
    blue2xc26da2
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    function susubmitPasscodes()
    {
    var codes = document.getElementById('passcodesArea').value.replace( /\n/g, " " ).split(" ");
    var count = 0;
    console.log('Submit code count: ' + codes.length + '\n');
    function submitPasscode(){
    if(count >= codes.length)
    {
    count=0;
    alert('All passcodes are processed.');
    return;
    }
    document.getElementById("redeem_reward_form").passcode.value = codes[count];
    console.log('Submit code: ' + codes[count] + '\n');
    document.getElementById("redeem_reward_form").submit.click();
    count++;

    setTimeout(submitPasscode, 25000 + Math.floor((Math.random() * 25000) + 1));
    };
    submitPasscode();
    };

    var passcodeBox = document.getElementById('header_passcode_box');


    var passcodesArea = document.createElement('textarea');
    passcodesArea.id = 'passcodesArea';
    passcodeBox.appendChild(passcodesArea);

    var batchSubmit = document.createElement("button");
    //<button onclick="myFunction()">Click me</button>
    batchSubmit.type = 'button';
    batchSubmit.name = 'batch-submit';
    batchSubmit.value = 'Submit';
    batchSubmit.onclick = susubmitPasscodes;
    batchSubmit.textContent = 'batchSubmit'
    passcodeBox.appendChild(batchSubmit);

如何构建一个 Java Agent

First. Implement a static premain (as an analogy to main) method, like this:

1
2
3
4
5
6
7
import java.lang.instrument.Instrumentation;

class Example {
public static void premain(String args, Instrumentation inst) {
...
}
}

Second. Create a manifest file (say, manifest.txt) marking this class for pre-main execution. Its contents are:

Premain-Class: Example

Third. Compile the class and package this class into a JAR archive:

javac Example.java
jar cmf manifest.txt yourAwesomeAgent.jar *.class

Fourth. Execute your JVM whith -javaagent parameter, like this:

java -javaagent:yourAwesomeAgent.jar -jar yourApp.jar

相思 - 头被按入水里

佛教公案:“师父将弟子头按入水中良久,泛沫渐少;师父将弟子拽起,复其元气,曰:汝求真谛如空气时,便知何为真谛矣。”

不见对方,就像我的头被按入水里一样滋味;我快要溺死了,呼吸不济了,经过这种窒息,我才重新认识我要寻求的“真谛”并练就了爱情中必不可缺的执着。

《恋人絮语·相思》


相思是纯粹的痛苦,一个人在一个人不在,对方并不知晓留下人的感受,守望之人陷入煎熬不能自已。

这是一场不知道何时终止的对抗,与时间同命运的战争,游戏已经开始。


我尝试我嘲笑过的行为

一只,两只,三只

绵羊都是乖乖的吗?

就如你摇头晃脑的样子

//

夜晚并不宁静

至少在我的城市里不是

晚上的月光可真耀眼

我没有想到地上的霜

我的相思要温暖一点点

//

或早或晚

不知何时

我捡回了我的睡眠

//

或早或晚

不知何时

我想我永远失去了你

Windows 推荐软件

在知乎上看了一些推荐

  • Total Commander
  • Listary
  • AutoHotKey
  • Internet Download Manager
  • paint.net
  • pot player
  • Tickeys
  • 7-zip
  • Beyond Compare
  • PowerTab (Powershell auto complete)
  • Fiddler
  • ZoomIt
  • Postman - Chrome 里的 HTTP/REST 客户端,Web 服务专用神器
  • Pixie - 简单,可爱,便携的取色器

快捷键

  • Windows+Tab调出虚拟桌面
  • Alt+Tab 切换不同的窗口
  • Windows+Ctrl+D 创建新的虚拟桌面
  • Windows+Ctrl+F4 关闭当前虚拟桌面
  • Ctrl+Windows+左右箭头 虚拟桌面切换

欲辩已忘言

前段时间,收获了两篇论文的接收通知。

目前正在学习 Verilog 语言,应对老板提出的 FPGA 项目减少功耗 10% 的任务。据说这是毕业前提之一,我暂且先接下来,学习一门新的语言还是比较有趣的,而且复习一下 FPGA 相关的开发还是有意思的。未来硬件会有更大的发挥空间,软件硬件化和硬件软件化应该是两个趋势。不过可能未来的 FPGA 硬件应该使用更抽象的语言来开发的。

最近开始面试工作了

  • 网易在线机试后要去杭州面试,放弃了,而且听说只报销 600¥ 路费,就不去凑 G20 的热闹了
  • 微软亚研,报的研发岗位,在线机试后,由于水平太差被刷,不能去提前招人的夏令营
  • Google 的机试轮现在我自己的算法水平通过不了
  • 华为的话,我去 FIT 签出国开会的请假条时,听胡杰说了给的钱不少,而且有很多方向可以选,于是联系了四个部门,都在接触中

整体而言,华为的面试倾向于沟通彼此研究开发的背景。面试官会问一些读博期间的研究方向和参与的项目,也会介绍公司的一些研究开发方向和项目应用场景。整体而言不像互联网公司涉及太多算法题目和语言细节(这一点我是听闻的,毕竟我只在六年前电面过一次腾讯)。几个方向都有匹配的地方,我觉得都可以去做一些事情。不过对于华为在工作环境和氛围方面的口碑,评价分化很严重。不过我搜索了一下知乎上相关的问题和华为的内部论坛“心声”。发现评价并没有分化太严重。

累是大家一致认同的。部门合作不畅,企业加班严重,考评不合理,PPT 和会议都很多等问题都是员工身心劳累。分歧在于,是否觉得这样的付出是否有价值吧。有些人认为提供了还不错的收入,让穷苦的人能够有所收获;有些人认为,为了这点钱牺牲掉自己的生活并不值得。另外有些人认为自己成长很快;有些人认为里面更多的是学习华为的业务,其中使用的很多技术是极其落后的。此外不同部门之间的评价也是有很多差别。

这些都在预期范围内。不过具体到部门的工作环境还是要具体沟通一下。对于钱,希望多一些;对于工作内容,希望有挑战性有趣一些;对于工作氛围,希望(在可能情况下),高效一些。不过降低预期是幸福之源,也要有心理准备。我懒得很,估计也不符合人家对“奋斗者”的期望,如果要去的话可能只是为了钱和钱。

华为在松山湖搞的仿 Google 的欧洲小镇风园区效果图还不错,而且也许我可以去松山湖划皮划艇。这样光想着玩可不好。


其他的工作慢慢搞吧,还有其他计划,比如去读个博后,继续思考下人生什么的。别人问题你未来有什么规划呢?对不同的人有不同的回答。在老家,就说找个赚钱多的工作;对一些人说想去公司看看;对一些人说希望可以出国工作。这么多的回答可能是我内心矛盾和虚伪的体现吧。目前的主要问题其实是对找工作没有激情。

有些人还是听我提过有种我向往的生活的,不过目前来看很遥远。在其境,谋其事吧。


题目要继续刷,就算暂时去不了相关公司,也算培养一个乐趣吧。


注:现在微软默认的输入法真是差劲,“机试”这个词我已经用输入法手工合成了多遍,仍然不能在输入全拼时前排显示,每个字都要翻好几页才能选中;“通过不了”中的“了”在非常后面的选字页。

对江苏高考减少招生名额的一点看法

关注了一下高考名额调配事件。分别看了一本录取率、985/211 录取率、本科录取率等统计数据和一些解读。

** 一本线 **

网上有一张各省一本录取率的图,其中几乎所有帖子都把山东拿出来吊打一番。你看,这厮还老说高考难,看那一本上线率!

山东一本录取率排全国第五,还是有点反直觉的。看解读的过程知道了一本线是各省自己定的,不同省份对一本线覆盖学校的定义也不一样。以前我以为山东只有两所一本…… 后来发现有许多学校竟然也是或者近些年进入了一本线。包括老家的德州大学都想改名“鲁北大学进入一本。我也是很无语。

说实话,把江苏的录取计划和山东对调一下,估计山东考生还是很开心的…… 我觉得这是山东考生被虐惯了,有些受虐综合症了。隔壁两个省的德性也都差不多,也许是因为本省没什么民营经济,都是官僚治下的国有大企业吧,人民没有发声的底气。

** 抗议 **

被施舍的心态

无论如何,家长的愤怒并不一定完全是针对这次事件,也是对某些特权省份的控诉。这种控诉,敝省人民最擅长了,不过也招致了高分低能的评价。而江苏的口碑明显好很多,卷子确实难啊。

而且教育相关部门发布政策的方式也不好,不过我也怀疑沟通的可能性。毕竟很容易进入“我不听,就是你冷酷无情”的情形。

前两年山东高考要把体育成绩也算到高考里,学生都开始练了,后来管教育的副省长被纪委搞进去了,也就没后文了。

我觉得就算抗议的人,也会有一部人觉得教育资源是“青天老爷”们施舍过来的。因此就请求老爷们公正一点。不过把政府视为老爷,人家就会视你为屁民。

** 思考 **

这个世界肯定不是平的,充斥着各种阶级、财富差距、种族、地域的鸿沟。挺支持江苏家长抗议的,每个人都发出自己的声音,大家才可以协商,构建稳定的底线。不过中国现今这种制度下,恐怕没有抗议的空间。即便如此,有声音也是好的,而且也没有更好的办法了,权利不是可以通过和平手段取得的。第一次出手也许无效,可以为以后的行动积累经验。

其实知道事情真相如何与觉得事情应该如何是两件事。公平、正义、利益、权利,怎么理解和处理都依赖于一个个具体的人。即使自己很渣,我也总时刻提醒自己《了不起的盖茨比》开卷的话:“每当你想批评人的时候,要记得,世上不是所有人都像你一样拥有许多优势。”

一些事情,我觉得是正确的,其中有些也涉及到我自身,我“希望”别人也认同,然而社会中很多人恐怕不会认可。我也接受每个人的观点都有其局限性,我的肯定也是。我想,在不强迫不使用暴力的情况下进行说服,也是可以的吧。

自己以后也要加强数据收集、分析和解读的能力,形成客观的观点。

一点小的感悟

前段时间碰到二老板,被“教育”了一番。让我放下自己的“爱好”(虽然她不知道我在干啥);她在实验室总看不到我人(实际上没人能在实验室的楼上经常看到她,所以反向来看,这句话也不错,她谁也看不着)。

在 Quora 上看到一个问题:Do Ph.D students get time to pursue their hobbies? 里面有个回答的一句话:

“You make time for hobbies,” she told me. “This isn’t undergrad anymore. This is the rest of your life.”

诚然如此。我兴趣很多,也做过很多尝试,疆场半途而废,逐渐不再为自己的不能坚持而自责(对自己的愤怒不能解决什么问题)。

最近在参加协会的攀岩集训,体会到力量不够、体重过大、技术太烂的苦闷,不过依旧兴趣盎然。攀岩技术里注重平衡,要通过核心力量在岩壁上进行重心的转换,我做得不好。生活中把各种事情平衡也是挺难的一件事情,一是要学会一些技巧,另外也要有支撑这些技巧的力量。

同样的一条路,不同的人有不同的走法,生活不是比赛,可以看看风景。

配个图吧,我很喜欢的电影 《Meru》

meru-poster
电影海报

The North Face Meru Expedition, 2011 The North Face Meru Expedition, 2011

Meru-Web-4

Exhausted, Renan Ozturk contemplates the long descent after making the summit. The top is only half way.
Exhausted, Renan Ozturk contemplates the long descent after making the summit. The top is only half way.

函数式语言课程期末考试判卷中遇到的一个问题

在使用半自动化 Judge 系统对同学的答题进行评测的时候,遇到了一个奇怪的问题,总是会提示:
Test_1: output.txt: openFile: resource busy (file is locked)


起初以为是 haskell 惰性求值导致的 IO 问题,因为搜索引擎也把猜测引导向这个原因,但是始终解决不了。


后来改变了思路,“现在看来好像是模块引入带来的 main 函数重名问题”,这是后面的猜疑。


继而发现将函数改名字也解决不了问题,实际也不是,就是 IO 的问题。因为如果先移除 output.txt, 那么使用 ghc 执行就不会出现之前的错误提示,不过在 ghci 中执行总是不会出错。

使用如下代码测试一下:

dir = "/home/user-name/Downloads/auto_check/work/2015final/ref/tests/words"

main :: IO ()
main = do print "hehe"
solution = runTest
         (map (\f -&gt; combine dir f) ["input1-1.txt", "input1-2.txt", "input1-3.txt"])
         (combine dir "output1.txt")
`</pre>

执行得到如下结果:

<pre>`➜  test  ghci Test_1.hs
GHCi, version 7.8.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 3] Compiling Main             ( Main.hs, interpreted )
[2 of 3] Compiling FileBasedTest    ( FileBasedTest.hs, interpreted )
[3 of 3] Compiling Test             ( Test_1.hs, interpreted )
Ok, modules loaded: Test, FileBasedTest, Main.
*Test&gt; main
Loading package array-0.5.0.0 ... linking ... done.
Loading package deepseq-1.3.0.2 ... linking ... done.
Loading package old-locale-1.0.0.6 ... linking ... done.
Loading package time-1.4.2 ... linking ... done.
Loading package bytestring-0.10.4.0 ... linking ... done.
Loading package unix-2.7.0.1 ... linking ... done.
Loading package filepath-1.3.0.2 ... linking ... done.
Loading package directory-1.2.1.0 ... linking ... done.
"hehe"
*Test&gt; 
Leaving GHCi.
➜  test  rm Test_1.hi
➜  test  ghc Test_1.hs -o Test_1
[3 of 3] Compiling Test             ( Test_1.hs, Test_1.o )
Linking Test_1 ...
➜  test  ./Test_1 
Test_1: output.txt: openFile: resource busy (file is locked)
➜  test  

可以看到直接执行 ghc 编译得到的二进制文件就会出现问题,而在 ghci 中就不会。


经过了一些过程之后终于修复,根本原因是,整个项目的程序入口是 test01.hs 中 Test 模块的 main 函数,而引入了同学实现的代码中的 Main 模块,导致 ghc 编译的时候使用 Main 模块中的 main 函数作为入口。最后通过指定那个模块中的 main 函数作为入口解决:
ghc -main-is Test.main Test_1.hs -o Test_1