haskell学習
環境構築
エディタ: GNU Emacs 29.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.38, cairo version 1.17.8)
OS
> uname -a
Linux hoge 6.6.1-arch1-1 #1 SMP PREEMPT_DYNAMIC Wed, 08 Nov 2023 16:05:38 +0000 x86_64 GNU/Linux
compose.yml
version: "3.8"
services:
haskell:
image: haskell:latest
tty: true
volumes:
- ./src:/src
working_dir: /src
latestでいいかはまだわからん。
ディレクトリ
> tree -a -I .git
.
├── compose.yml
├── .gitignore
└── src
├── sample
├── sample.hi
├── sample.hs
└── sample.o
.gitignore
/src/*
!/src/*.hs
Emacsの初期起動に5分近くかかる設定
コピペ
haskell部分だけ抜粋。
PCスペックとかも関係あるかも。
(use-package haskell-mode
:ensure t
:init
(progn
(add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
(add-hook 'haskell-mode-hook 'turn-on-haskell-indent)
(add-hook 'haskell-mode-hook 'interactive-haskell-mode)
(setq haskell-process-args-cabal-new-repl
'("--ghc-options=-ferror-spans -fshow-loaded-modules"))
(setq haskell-process-type 'cabal-new-repl)
(setq haskell-stylish-on-save 't)
(setq haskell-tags-on-save 't)
)
)
(use-package flycheck-haskell
:ensure t
:config
(add-hook 'flycheck-mode-hook #'flycheck-haskell-setup)
(eval-after-load 'haskell-mode-hook 'flycheck-mode)
)
;; (use-package flymake-hlint
;; :ensure t
;; :config
;; (add-hook 'haskell-mode-hook 'flymake-hlint-load))
(use-package lsp-haskell
:ensure t
:config
(add-hook 'haskell-mode-hook #'lsp)
)
しばらくファイルが開かずにEmacsが固まってしまってもC-gで逃げる前に5分くらいは一度待ったほうがいいかもしれない。
...
cabal install hlint 1681.94s user 94.33s system 210% cpu 14:05.17 total
低スペックPCは辛い
replで複数行入力する
ghciの複数行入力時には:{:}でくくる
ghci> :{
euc :: Int -> Int -> Int
euc 0 b = b
euc a 0 = a
euc a b
| a == 0 = b
| b == 0 = a
| otherwise = if a > b then euc b (a - b) else euc a (b - a)
ghci> :}
関数合成
Clojureでいうところの->が近いか?
> map (\x -> negate (abs x)) [5, -3, -6, 7, -3, 2, -19, 24]
[-5,-3,-6,-7,-3,-2,-19,-24]
> map (negate . abs) [5, -3, -6, 7, -3, 2, -19, 24]
[-5,-3,-6,-7,-3,-2,-19,-24]
あ、今すごいH本やってる
数年前みたとき関数適用と合わせたやつ見て混乱してたけど
こいつ要は入れ子解消マンだと認識を更新した。
が、すごいHな本を見る限りはそれだけの理解だと後から痛い目見そう
関数適用
$
これは前からわかったつもりでいて、まあ遅延評価みたいなやつだと考えていたが
> map ($ 3) [(*3), (+2)]
[9,5]
これはよくわからない。
が、そうか、関数という箱に入れたんだ。
これは後々にでてくるアプリカティブとかの理解の助けになるかもしてない。
今理解した。なんでこいつは評価が遅れるのか
関数に入れているからだ。
> map func map func2 list
だと当然だがfuncの後のmap...を評価して型エラーになってしまう。
しかし、
emacsからhoogle使いてーと思って調べてみたらhaskell-modeに標準装備であるんだ
ローカルで立てることもできるみたいだ。
ローカルとか参照するなら
ここらへんのURL上書きすればいけそう欲がでてZennに書いてしまったけどドキュメント集約したいので閉じる