Closed12

haskell学習

wlboooooooooonwlboooooooooon

環境構築

エディタ: 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
wlboooooooooonwlboooooooooon

Emacsの初期起動に5分近くかかる設定

https://gist.github.com/shapr/d359a91c90419f5f5e99dfce338258e8

コピペ

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)
  )

wlboooooooooonwlboooooooooon

しばらくファイルが開かずにEmacsが固まってしまってもC-gで逃げる前に5分くらいは一度待ったほうがいいかもしれない。

wlboooooooooonwlboooooooooon
...
cabal install hlint  1681.94s user 94.33s system 210% cpu 14:05.17 total

低スペックPCは辛い

wlboooooooooonwlboooooooooon

関数合成

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本やってる

wlboooooooooonwlboooooooooon

数年前みたとき関数適用と合わせたやつ見て混乱してたけど
こいつ要は入れ子解消マンだと認識を更新した。

が、すごいHな本を見る限りはそれだけの理解だと後から痛い目見そう

wlboooooooooonwlboooooooooon

関数適用

$

これは前からわかったつもりでいて、まあ遅延評価みたいなやつだと考えていたが

> map ($ 3) [(*3), (+2)]
[9,5]

これはよくわからない。

が、そうか、関数という箱に入れたんだ。

これは後々にでてくるアプリカティブとかの理解の助けになるかもしてない。

wlboooooooooonwlboooooooooon

今理解した。なんでこいつは評価が遅れるのか
関数に入れているからだ。

> map func map func2 list

だと当然だがfuncの後のmap...を評価して型エラーになってしまう。

しかし、を使うことによりこれ以降の引数がすべて関数にラッピングされてしまい、一瞬評価が遅れる、いや、先に後ろの方の評価が発生してしまって、リストが返却された状態で前のmapが実行されるからエラーが起きないのか

wlboooooooooonwlboooooooooon

emacsからhoogle使いてーと思って調べてみたらhaskell-modeに標準装備であるんだ
https://github.com/haskell/haskell-mode/blob/master/haskell-hoogle.el

wlboooooooooonwlboooooooooon

欲がでてZennに書いてしまったけどドキュメント集約したいので閉じる

このスクラップは5ヶ月前にクローズされました