読者です 読者をやめる 読者になる 読者になる

学生の備忘録なブログ

日々のことを忘れないためのブログです。

ふつうのHaskellのコードについて

サンプルコードが正しくない.

 ふつうのHaskell内容がjavaを例示しながら書かれているシンプルで分かりやすい本である.

 私にはすごいHaskellより分かりやすい.しかし,古いためサンプルコードが動かない.

先達

2016-01-11 『ふつうのHaskellプログラミング』 もくもく読書会(第12章) の振り返り - SE情報技術研究会’s blog

Haskellを始めるにあたって読むべき3冊の本 - セカイノカタチ::Techlog

github.com

ファイルの文字列検索 ~emacs,shellコマンド~

目的

複数のファイル間で,あるいはあるディレクトリ配下全てで,文字列検索をしたい.

動機

 サンプルプログラムを,ダウンロードしてきて,このコードを使ってるコードを網羅的に探したい.

emacs

M-x grep-find

C-o,o,C-p,pなど色々面白い.ただ,見るためにバッファが全て開かれる.これは良くない所.ほかにいいのないかな.

f:id:forhighlow:20170421185613g:plain

C-x C-b 
(あるいはC-x b)して,
markをつけて,
C-z (あるいはtab,Function)でpatternで選択,
kill bufferを選んで一気に消さなければならない.

shellコマンド

 どこからかコピペしてきたやつ.申し訳ありません.

##########################
# grep
#   -r : 再帰的にgrepコマンドを実行する
#   -n : 行番号を出力する
#   -w : 文字列全体にマッチする場合
#   -l : (option)これをつければファイル名だけを出力(マッチした部分は省く)
#
# Usage
#   # 現在いるディレクトリ配下から「httpd」という文字列を含むファイルすべてを抽出する
#   $ grep -rnw . -e "httpd"
##########################
grep -rnw 'directory' -e "pattern"

Haskell ~入出力~

入出力

コード

main = do
  out <- getLine -- input: out
  putStrLn (out ++ "は大事") 
% stack build;stack exec project1-exe 
project1-0.1.0.0: unregistering (local file changes: src/Lib.hs)
project1-0.1.0.0: build (lib + exe)
Preprocessing library project1-0.1.0.0...
[1 of 1] Compiling Lib              ( src/Lib.hs, .stack-work/dist/x86_64-osx/Cabal-1.24.2.0/build/Lib.o )
Preprocessing executable 'project1-exe' for project1-0.1.0.0...
[1 of 1] Compiling Main             ( app/Main.hs, .stack-work/dist/x86_64-osx/Cabal-1.24.2.0/build/project1-exe/project1-exe-tmp/Main.o ) [Lib changed]
Linking .stack-work/dist/x86_64-osx/Cabal-1.24.2.0/build/project1-exe/project1-exe ...
project1-0.1.0.0: copy/register
Installing library in
/.stack-work/install/x86_64-osx/lts-8.11/8.0.2/lib/x86_64-osx-ghc-8.0.2/project1-0.1.0.0-AckhfDVtQB568iPvGBSrt7
Installing executable(s) in
/.stack-work/install/x86_64-osx/lts-8.11/8.0.2/bin
Registering project1-0.1.0.0...

% stack exec project1-exe
hellowordl
hellowordlは大事

do式

コードのレイアウト

 do式の複数の式を束ねる構文である.Javaのブロック構文に相当する.

 do式のように複数の式を束ねる構文では,複数の式のインデントを揃えることが属するブロックを表す.

 この規則を,レイアウト,またはオフサイドルールという.

do式と遅延評価

 Haskellの特徴は遅延評価である.よって,命令型のプログラム言語のように上から順に実行されるわけではない.do式を使うと,上から処理されていく.

参考

ふつうのHaskell

Amazon CAPTCHA

ここの記事が小さく良くまとまって書いてある. Haskellで競技プログラミング IO編 - Qiita

markdownの見出し

見出しがほしい

 見通しが良いのに越したことはない.

人間の脳機能として

 人間は,一つのモデルを学習する(etc,,,技術本)際には,頭のなかに骨組みを作ってから,それに肉付けしていく.

 目次はそれの骨組みの構築の助けになる.よって,読者の理解度を向上するという点でも,重要なのだ.

目次をつける方法

[:contents]

まとめ

 定型文でつけるかは考えもの

Haskellの学習する動機

なぜhaskellを学ぶか

注意この記事は,全く固まっていない私の考えを形にするためのものです.

 これにはいろいろな記事が言語問わずある.  

 今日2017/04/19時点で学ぶ動機は,現状,まだ使われている純粋関数型の生き残りであるからである.

 純粋関数型と呼ばれる言語は数あれど,現在いまだ使われているものは少ない,そのなかでも,変数や引数の評価の際に,融通がきかないのはHaskellくらいである.他の言語は人間に歩み寄り,本来の純粋関数型の形では通らない表現が可能である.

 よって,純粋関数型を勉強したいと思った時Haskellが適切である.これは,別にHaskellが生産性が高く,直感的で,コミュニティが活発で,パッケージが充実していて,などそういった尺度で選ばれたわけではない.

結論

 純粋関数型の勉強のため

追記2017/04/19

 あまりにもあまりになので「ふつうのHaskellプログラミング」を読んでみた.

「ふつうのHaskellプログラミング」作者が言うには,,,

  1. 柔軟なプログラミング
    • 高階関数というものをhaskellは持つ.
      • これは,関数を引数として受け取ったり,返したりする関数のこと.
  2. コンパイル時の型のチェックが強力
    • 多相型という機能があり,様々な型を使いたいときに統一的に扱うことができる.これはJavaの総称型とほぼ等しい.
  3. 可読性が高い
    • 再代入ができないことは,現代の大人数のソフトウェア開発においても,代入の乱用による可読性の低下を0にできる.
  4. 遅延評価
    • 純粋関数型言語は他多数ある.ML,CommonLisp,Scheme,などだ.しかし,これらは遅延評価をしない.
      • 遅延評価とは引数を必要なときに評価するということである.これは,純粋関数型において,柔軟性を発揮する.

markdown記法について

 空白はめちゃくちゃ大事.

 特に,記号をリストとかにしたい時,記号の後に空白入れないといけない

 "「* 」でリスト表現,ただし,タブか空白文字4つで階層を表さないといけない"

* hoge
    * fuga
        * piyo
  • hoge
    • fuga
      • piyo  

オブジェクト指向についての記事

面白かったのでメモ

qiita.com

Haskellの環境構築 ~importできないとき~

importできないときは

 参考書のコードをそのまま入れてみても,実際は動かないことが多い.これはどの言語にも起こる.めげない.

原因

 パッケージがそもそもない,あるいはコンパイラが参照できないか.この場合は参照である.

解決策

 stackのプロジェクト機能で環境構築をした.この場合はワークスペースディレクトリ内部に*.cabalという設定ファイルがあるため,ここのライブラリに書き加えれば良い.

改善する前

% stack build
project1-0.1.0.0: build (lib + exe)
Preprocessing library project1-0.1.0.0...
[1 of 1] Compiling Lib              ( src/Lib.hs, .stack-work/dist/x86_64-osx/Cabal-1.24.2.0/build/Lib.o )

/Users/hoge/Desktop/Software-engineering/project1/src/Lib.hs:4:1: error:
    Failed to load interface for ‘Data.Map’
    It is a member of the hidden package ‘containers-0.5.7.1’.
    Perhaps you need to add ‘containers’ to the build-depends in your .cabal file.
    Use -v to see a list of the files searched for.

--  While building package project1-0.1.0.0 using:
      /Users/hoge/.stack/setup-exe-cache/x86_64-osx/Cabal-simple_mPHDZzAJ_1.24.2.0_ghc-8.0.2 --builddir=.stack-work/dist/x86_64-osx/Cabal-1.24.2.0 build lib:project1 exe:project1-exe --ghc-options " -ddump-hi -ddump-to-file"
    Process exited with code: ExitFailure 1

  Perhaps you need to add ‘containers’ to the build-depends in your .cabal file.

 ここから,containsersが足りないようだと分かる.  よって,設定ファイル*.cabalに', containers'を追記した.

name:                project1
version:             0.1.0.0
-- synopsis:
-- description:
homepage:            https://github.com/githubuser/project1#readme
license:             BSD3
license-file:        LICENSE
author:              Author name here
maintainer:          example@example.com
copyright:           2017 Author name here
category:            Web
build-type:          Simple
extra-source-files:  README.md
cabal-version:       >=1.10

library
  hs-source-dirs:      src
  exposed-modules:     Lib
  build-depends:       base >= 4.7 && < 5
                     , containers
  default-language:    Haskell2010

executable project1-exe
  hs-source-dirs:      app
  main-is:             Main.hs
  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
  build-depends:       base
                     , project1
  default-language:    Haskell2010

test-suite project1-test
  type:                exitcode-stdio-1.0
  hs-source-dirs:      test
  main-is:             Spec.hs
  build-depends:       base
                     , project1
  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
  default-language:    Haskell2010

source-repository head
  type:     git
  location: https://github.com/githubuser/project1

 これで実行することができた.

参考元

Stackでやる最速Haskell Hello world! (GHCのインストール付き!) - Qiita