Closed12

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分近くかかる設定

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

西島ボルバルザーク健吾西島ボルバルザーク健吾

関数合成

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...を評価して型エラーになってしまう。

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

西島ボルバルザーク健吾西島ボルバルザーク健吾

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

このスクラップは2023/12/04にクローズされました