用Stack和VSCode配置Haskell环境

手抖选了门课,然后需要捡起放弃治疗的Haskell了。原来嫌在Windows上折腾haskell太麻烦所以用了虚拟机,这次不想用虚拟机,然而bash on Windows又不能跑ghc,所以作死的在Windows上折腾了一下,居然成功了。

setup

由于本来系统上没有和haskell相关的东西,所以可以放心的没有历史遗留问题的使用stack,参考邵成聚聚的专栏修改配置,顺手把http都换成https,然后运行stack setup,接着就愉快的失败了。

失败了

下载失败,而且我已经换上了https,所以已经不会是运营商的锅,于是干脆去掉config.yaml里自己设置的部分,再次setup,下载速度太慢

而且在更改config.yaml前后下载的msys2版本不同(更改后为2016,更改前为2015),所以直接下载tuna上的2015版本的msys2放在指定目录,再再次setup,成功,然后删除msys2,因为我本来就装了

vscode

许久没见VSCode里多了不少Haskell的插件,有个Haskero看起来不错,不过保守起见我还是选择了ghc-mod

stack中安装ghc-mod,权限错误,重新用Administrator安装,正常使用。

test

听过ghc现在用上了llvm,速度有了很大提升,所以我很开心的用非著名benmark样例fibonacci数列来测试了一发ghc的性能。

1
2
3
4
5
6
7
8
9
module Main (main) where
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n -1) + fib(n - 2)
main :: IO ()
main = print $ fib 40
1
2
3
4
5
6
7
#include <stdio.h>
int fib(int n) {
return (n == 0 || n == 1) ? n : fib(n - 1) + fib(n - 2);
}
int main() {
printf("%d\n", fib(40));
}
1
2
3
4
5
6
7
import std.stdio;
int fib(int n) {
return (n == 0 || n == 1) ? n : fib(n - 1) + fib(n - 2);
}
void main() {
writeln(fib(40));
}

在没有启用优化的情况下,ghc编译出来的程序运行时间是g++的8倍,d没有参与第一次比较

O2

开启O2优化后

O2
由上至下依次是d(ldc 1.0.0 x86_64-pc-windows-msvc),C++(g++ 6.3.0 MinGW64)haskell(ghc 8.0.2 x86_64)

差不多一个数量级了

对了

对了,硬件不好别碰FUNCTIONAL PROGRAMMING LANGUAGE

memory

后续一

config.yaml里加上skip-msys: true来省去msys2的安装和下载,不过tuna方面正在修这个bug

后续二

强行把haskell写成了lisp

lisp


本博的原创作品作品采用知识共享署名 2.5 中国大陆许可协议 进行许可,欢迎转载,但转载请注明出处,并保持转载后文章内容的完整。
本文链接:http://fallenwood.github.io/2017/02/13/installing-haskell/