fugafuga.write

日々のログ



すごいH本 part26

クリスマス後に4℃のアクセサリが多数オークションに出品されるのはとても趣がある。

モジュール

Haskell にはモジュールがある。モジュールには複数の関数と型を定義できる。 そのモジュールのうちの幾つか、または全てをエクスポートできる。 エクスポートするとモジュールの中のものを外から使えるようになる。

Haskell のモジュールは https://hackage.haskell.org/ にたくさんあり、stack install パッケージ名 でインストールできる。

モジュールインポート

import ModuleName でインポートできる。インポート構文は全ての関数定義よりも前に書く必要がある。

import Data.List

numUniques :: (Eq a) => [a] -> Int
numUniques = length . nub

nubData.Listがエクスポートする関数の1つで、リストから重複する要素を取り除く関数。

GHCiからもインポートできる。

*Main> :m + Data.List
*Main> import Data.List

どちらの書き方でもいける。

複数のモジュールをインポートする

*Main Lib> :m + Data.List Data.Map Data.Set

<no location info>: error:
    Could not find module ‘Data.Map’
    It is a member of the hidden package ‘containers-0.5.7.1@containers-0.5.7.1’.

エラーが出る

my-project.cabalbuild-dependscontainersを追加

name:                my-project
version:             0.1.0.0
synopsis:            Short description of your package
homepage:            https://github.com/githubuser/my-project#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

-- To avoid duplicated efforts in documentation and dealing with the
-- complications of embedding Haddock markup inside cabal files, it is
-- common to point users to the README.md file.
description:         Please see the README on Github at <https://github.com/githubuser/my-project#readme>

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

インポートできた

*Main Lib> :m + Data.List Data.Map Data.Set
*Main Lib Data.List Data.Map Data.Set>

あるモジュールの特定の関数のみインポートする

*Main Lib> import Data.List (nub, sort)
*Main Lib Data.List>

読み込みたくない関数以外をインポートする

*Main Lib> import Data.List hiding (nub)
*Main Lib Data.List>

nub 以外をインポート

関数の名前衝突を避ける方法

*Main Lib> import qualified Data.Map
*Main Lib Data.Map>

これでインポートするとData.Map.filterで関数呼出する必要がある。

別名をつけられる

*Main Lib> import qualified Data.Map as M
*Main Lib M>

M.filterで関数にアクセスできる

所感

stack まわりの設定がよくわからん。調べる必要がある。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

  • 作者: MiranLipovaca
  • 出版社/メーカー: オーム社
  • 発売日: 2017/07/14
  • メディア: Kindle版
  • 購入: 4人 クリック: 9回
  • この商品を含むブログを見る