{"id":1168,"date":"2017-10-14T23:41:34","date_gmt":"2017-10-14T14:41:34","guid":{"rendered":"http:\/\/randt.jp\/?page_id=1168"},"modified":"2017-11-09T00:06:06","modified_gmt":"2017-11-08T15:06:06","slug":"haskell%e3%81%ae%e9%96%8b%e7%99%ba%e7%92%b0%e5%a2%83","status":"publish","type":"page","link":"https:\/\/randt.jp\/?page_id=1168","title":{"rendered":"haskell\u306e\u958b\u767a\u74b0\u5883"},"content":{"rendered":"<h3>Stack<\/h3>\n<li>\u8ab2\u984c\uff1a\u30d1\u30c3\u30b1\u30fc\u30b8\u4f9d\u5b58\u6027\u3092\u7ba1\u7406\u3059\u308b<\/li>\n<li>\u65bd\u7b56\uff1astackage\u3067\u7ba1\u7406\u3055\u308c\u3066\u3044\u308b\u3002stack\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u3063\u3066\u5229\u7528\u3059\u308b<\/li>\n<p>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u53c2\u8003\u30b5\u30a4\u30c8\uff1a<a href=\"https:\/\/qiita.com\/waddlaw\/items\/49874f4cf9b680e4b015\" rel=\"noopener\" target=\"_blank\">\u672c\u6c17\u3067 Haskell \u3057\u305f\u3044\u4eba\u5411\u3051\u306e Stack \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb<\/a>\n<\/p>\n<h2>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h2>\n<pre>\r\n$ curl -sSL https:\/\/get.haskellstack.org\/ | sh\r\n$\r\n$ tail -3 ~\/.profile \r\nif [ -d \"$HOME\/.local\/bin\" ] ; then\r\n    PATH=\"$HOME\/.local\/bin:$PATH\"\r\nfi\r\n$\r\n$ stack --version\r\nVersion 1.5.1 i386 hpack-0.17.1\r\n$ which stack\r\n\/usr\/local\/bin\/stack\r\n$ eval \"$(stack --bash-completion-script stack)\"\r\n$ stack setup\r\n$ stack ghc -- --version\r\nThe Glorious Glasgow Haskell Compilation System, version 8.0.2\r\n$ stack ghci\r\nConfiguring GHCi with the following packages: \r\nGHCi, version 8.0.2: http:\/\/www.haskell.org\/ghc\/  :? for help\r\nLoaded GHCi configuration from \/tmp\/ghci26042\/ghci-script\r\nPrelude>  :q\r\nLeaving GHCi.\r\n$ stack install cabal-install\r\n :\r\nCopying from \/home\/XXXXXXXXX\/.stack\/snapshots\/i386-linux\/lts-9.12\/8.0.2\/bin\/cabal to \/home\/XXXXXXXX\/.local\/bin\/cabal\r\n\r\nCopied executables to \/home\/XXXXXXXX\/.local\/bin:\r\n- cabal\r\n$ cabal --version\r\ncabal-install version 1.24.0.2\r\ncompiled using version 1.24.2.0 of the Cabal library \r\n$\r\n<\/pre>\n<h3>\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u74b0\u5883<\/h3>\n<h2>hoogle<\/h2>\n<pre>\r\n$ stack install hoogle\r\n$ which hoogle\r\n\/home\/t-randt\/.local\/bin\/hoogle\r\n$ stack hoogle --init\r\n<\/pre>\n<h2>ghc-mod\/hlint<\/h2>\n<p>\u578b\u6ce8\u91c8\u3084\u9759\u7684\u89e3\u6790\u306e\u305f\u3081<\/p>\n<pre>\r\n$ stack install ghc-mod hlint\r\n$ $ which ghc-mod\r\n\/home\/t-randt\/.local\/bin\/ghc-mod\r\n$ which ghc-modi\r\n\/home\/t-randt\/.local\/bin\/ghc-modi\r\n$ which hlint\r\n\/home\/t-randt\/.local\/bin\/hlint\r\n<\/pre>\n<h2>haskell-mode<\/h2>\n<p>emacs\u7528mode<\/p>\n<pre>\r\n$ apt-get install haskell-mode\r\n$ cat ~\/.emacs.d\/haskell_mode.el\r\n$\r\n<\/pre>\n<pre>\r\n;; haskell-mode\r\n(autoload 'haskell-mode \"haskell-mode\")\r\n(autoload 'haskell-cabal \"haskell-cabal\")\r\n(add-to-list 'auto-mode-alist '(\"\\\\.hs$\" . haskell-mode))\r\n(add-to-list 'auto-mode-alist '(\"\\\\.lhs$\" . literate-haskell-mode))\r\n(add-to-list 'auto-mode-alist '(\"\\\\.cabal\\\\'\" . haskell-cabal-mode))\r\n\r\n(add-to-list 'interpreter-mode-alist '(\"runghc\" . haskell-mode))\r\n(add-to-list 'interpreter-mode-alist '(\"runhaskell\" . haskell-mode))\r\n;; indent \u306e\u6709\u52b9.\r\n(add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)\r\n(add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)\r\n(add-hook 'haskell-mode-hook 'font-lock-mode)\r\n(add-hook 'haskell-mode-hook 'imenu-add-menubar-index)\r\n;; ghci\u8d77\u52d5\r\n;; (setq haskell-process-type 'stack-ghci)\r\n;; (setq haskell-process-path-ghci \"stack\")\r\n;; (setq haskell-process-args-ghci \"ghci\")\r\n(setq haskell-program-name \"stack ghci\")\r\n\r\n;; C-c C-l\u3067\u8d77\u52d5\r\n(add-hook 'haskell-mode-hook 'inf-haskell-mode)\r\n;; ghci \u306e\u8d77\u52d5\u3068\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u3092\u4e00\u7dd2\u306b\u884c\u3046\u8a2d\u5b9a.\r\n(defadvice inferior-haskell-load-file (after change-focus-after-load)\r\n  \"Change focus to GHCi window after C-c C-l command\"\r\n  (other-window 1))\r\n(ad-activate 'inferior-haskell-load-file)\r\n<\/pre>\n<ul>\n<li><a href=\"https:\/\/uwabami.github.io\/cc-env\/Emacs.html\" rel=\"noopener\" target=\"_blank\">Emacs\u306e\u8a2d\u5b9a<\/a><\/li>\n<li><a href=\"http:\/\/futurismo.biz\/archives\/2662\" rel=\"noopener\" target=\"_blank\">Haskell \u3092\u5feb\u9069\u306b\u5229\u7528\u3059\u308b\u305f\u3081\u306e Emacs \u74b0\u5883\u306e\u69cb\u7bc9<\/a><\/li>\n<li><a href=\"https:\/\/qiita.com\/t-mochizuki\/items\/d831df3a920108e2d83c\" rel=\"noopener\" target=\"_blank\">Stack\u3092haskell-mode\u3067\u4f7f\u3063\u3066\u307f\u3088\u3046<\/a><\/li>\n<li><a href=\"http:\/\/blog.515hikaru.net\/entry\/2016\/09\/12\/021206\" rel=\"noopener\" target=\"_blank\">\u6c17\u304c\u3064\u3044\u305f\u3089 Emacs \u306e Haskell \u3092\u52c9\u5f37\u3059\u308b\u74b0\u5883\u304c\u6574\u3063\u3066\u3044\u305f\u8a71<\/a><\/li>\n<\/ul>\n<h2>\u65b0\u898f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8<\/h2>\n<pre>\r\n$ stack new hello\r\n$ cat hello\/src\/Lib.hs\r\nmodule Lib\r\n    ( someFunc\r\n    ) where\r\n\r\nsomeFunc :: IO ()\r\nsomeFunc = putStrLn \"Hello World!!\"\r\n<\/pre>\n<h2>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30d3\u30eb\u30c9<\/h2>\n<pre>\r\n$ stack build hello\r\n$ stack exec hello\r\nHello, World!\r\n$\r\n<\/pre>\n<h2>git\u767b\u9332<\/h2>\n<pre>\r\n$ cd hello\r\n$ stack clean --full\r\n$ git add hello\r\n$ git status\r\n\u30d6\u30e9\u30f3\u30c1 master\r\nYour branch is up-to-date with 'origin\/master'.\r\n\u30b3\u30df\u30c3\u30c8\u4e88\u5b9a\u306e\u5909\u66f4\u70b9:\r\n  (use \"git reset HEAD <file>...\" to unstage)\r\n\r\n\tnew file:   hello\/LICENSE\r\n\tnew file:   hello\/README.md\r\n\tnew file:   hello\/Setup.hs\r\n\tnew file:   hello\/app\/Main.hs\r\n\tnew file:   hello\/hello.cabal\r\n\tnew file:   hello\/src\/Lib.hs\r\n\tnew file:   hello\/src\/Lib.hs~\r\n\tnew file:   hello\/stack.yaml\r\n\tnew file:   hello\/test\/Spec.hs\r\n\r\n$ git commit\r\n[master 0d6c5fb] initial\r\n 9 files changed, 160 insertions(+)\r\n create mode 100644 hello\/LICENSE\r\n create mode 100644 hello\/README.md\r\n create mode 100644 hello\/Setup.hs\r\n create mode 100644 hello\/app\/Main.hs\r\n create mode 100644 hello\/hello.cabal\r\n create mode 100644 hello\/src\/Lib.hs\r\n create mode 100644 hello\/src\/Lib.hs~\r\n create mode 100644 hello\/stack.yaml\r\n create mode 100644 hello\/test\/Spec.hs\r\n$ git push\r\nUsername for 'https:\/\/bitbucket.org': XXXXXXXX\r\nPassword for 'https:\/\/bbbae@bitbucket.org': \r\nCounting objects: 9, done.\r\nDelta compression using up to 2 threads.\r\nCompressing objects: 100% (8\/8), done.\r\nWriting objects: 100% (9\/9), 2.17 KiB | 0 bytes\/s, done.\r\nTotal 9 (delta 2), reused 0 (delta 0)\r\nTo https:\/\/bitbucket.org\/XXXXXXXXXX\/sample_haskell\r\n   5f363bd..0d6c5fb  master -> master\r\n$ \r\n<\/file><\/pre>\n<pre>\r\n$ cat .emacs.d\/package.el\r\n(require 'package)\r\n\r\n;; MELPA\u3092\u8ffd\u52a0\r\n(add-to-list 'package-archives '(\"melpa\" . \"https:\/\/melpa.org\/packages\/\") t)\r\n\r\n;; MELPA-stable\u3092\u8ffd\u52a0\r\n(add-to-list 'package-archives '(\"melpa-stable\" . \"https:\/\/stable.melpa.org\/packages\/\") t)\r\n\r\n;; Marmalade\u3092\u8ffd\u52a0\r\n(add-to-list 'package-archives  '(\"marmalade\" . \"http:\/\/marmalade-repo.org\/packages\/\") t)\r\n\r\n;; Org\u3092\u8ffd\u52a0\r\n(add-to-list 'package-archives '(\"org\" . \"http:\/\/orgmode.org\/elpa\/\") t)\r\n\r\n;; \u521d\u671f\u5316\r\n(package-initialize)\r\n$\r\n<\/pre>\n<h2>flycheck<\/h2>\n<ul>\n<li><a href=\"https:\/\/qiita.com\/senda-akiha\/items\/cddb02cfdbc0c8c7bc2b\" rel=\"noopener\" target=\"_blank\">Flycheck\u3067\u30e2\u30c0\u30f3\u306a\u30b7\u30f3\u30bf\u30c3\u30af\u30b9\u30c1\u30a7\u30c3\u30af<\/a><\/li>\n<\/ul>\n<pre>\r\n$ cat ~\/.emacs.d\/flycheck.el \r\n;;for flycheck\r\n(add-hook 'after-init-hook #'global-flycheck-mode)\r\n;; for flycheck-top-tip\r\n(eval-after-load 'flycheck\r\n  '(custom-set-variables\r\n    '(flycheck-display-errors-function #'flycheck-pos-tip-error-messages)))\r\n<\/pre>\n<h2>doctest\/quickchec\/hspec<\/h2>\n<pre>\r\n$ stack install doctest\r\n$ stack exec doctest -- --version\r\ndoctest version 0.11.4\r\nusing version 8.0.2 of the GHC API\r\nusing \/home\/t-randt\/.stack\/programs\/i386-linux\/ghc-8.0.2\/bin\/ghc-8.0.2\r\n$ stack install hspec\r\n$ \r\n<\/pre>\n<h2>\u30d0\u30c3\u30af\u30a2\u30d7\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u3089\u306a\u3044<\/h2>\n<pre>\r\n$ cat .\/.emacs.d\/tempfile.el\r\n;;; backup file dir.\r\n(add-to-list 'backup-directory-alist\r\n\t     (cons (expand-file-name \"~\/\") (expand-file-name \"~\/temp\/\")))\r\n;;; auto save dir\r\n(add-to-list 'auto-save-file-name-transforms\r\n\t     `(\"~\/\\\\([^\/]*\/\\\\)*\\\\([^\/]*\\\\)$\" \"~\/temp\/\\\\2\" t))\r\n$\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Stack \u8ab2\u984c\uff1a\u30d1\u30c3\u30b1\u30fc\u30b8\u4f9d\u5b58\u6027\u3092\u7ba1\u7406\u3059\u308b \u65bd\u7b56\uff1astackage\u3067\u7ba1\u7406\u3055\u308c\u3066\u3044\u308b\u3002stack\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u3063\u3066\u5229\u7528\u3059\u308b \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u53c2\u8003\u30b5\u30a4\u30c8\uff1a\u672c\u6c17\u3067 Haskell \u3057\u305f\u3044\u4eba\u5411\u3051\u306e Stack \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb \u30a4\u30f3\u30b9 &#8230;<\/p>\n<p> <a class=\"continue-reading-link\" href=\"https:\/\/randt.jp\/?page_id=1168\"><span>Continue reading<\/span><i class=\"crycon-right-dir\"><\/i><\/a> <\/p>\n","protected":false},"author":4,"featured_media":0,"parent":247,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1168","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/randt.jp\/index.php?rest_route=\/wp\/v2\/pages\/1168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/randt.jp\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/randt.jp\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/randt.jp\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/randt.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1168"}],"version-history":[{"count":38,"href":"https:\/\/randt.jp\/index.php?rest_route=\/wp\/v2\/pages\/1168\/revisions"}],"predecessor-version":[{"id":1218,"href":"https:\/\/randt.jp\/index.php?rest_route=\/wp\/v2\/pages\/1168\/revisions\/1218"}],"up":[{"embeddable":true,"href":"https:\/\/randt.jp\/index.php?rest_route=\/wp\/v2\/pages\/247"}],"wp:attachment":[{"href":"https:\/\/randt.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}