Haskell > 本 > 入門Haskellプログラミング > LESSON 4

入門Haskellプログラミング

  入門Haskellプログラミング
Will Kurt
翔泳社
2019-07-31
¥ 4,104

LESSON 4

レッスン4で学ぶ内容

  • ファーストクラス関数の定義
  • 関数を他の関数への引数として使用する方法
  • 関数の計算を抽象化する方法
  • 関数を値として返す方法

4.1 引数としての関数

関数を他の関数への引数や他の関数からの戻り値として使用することができます。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
-- ファーストクラス関数
ifEven myFunction x = if even x
    then myFunction x
    else x
 
inc n = n + 1
double n = n * 2
square n = n ^ 2
 
ifEvenInc n = ifEven inc n
ifEvenDouble n = ifEven double n
ifEvenSquare n = ifEven square n
*Main> ifEvenInc 4
5
*Main> ifEvenDouble 10
20
*Main> ifEvenSquare 20
400

動作OK

関数は演算子よりも優先順位が高い

*Main> inc 2 * 3
9

inc 2 が先に計算されて3になる。
3 * 3 = 9になる。

2 * 3が先に計算されて、inc 6 = 7、とはならないことに注意!

カスタムソート

関数を他の関数に渡す用途の1つはソートです。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
import Data.List
 
names = [
    ("Ian", "Curtis"),
    ("Bernard", "Sumer"),
    ("Peter", "Hook"),
    ("Stephen", "Morris")
    ]
 
-- sort names
 
compareLastNames name1 name2 = if lastName1 > lastName2
        then GT
        else if lastName1 < lastName2
            then LT
            else EQ
    where
        lastName1 = snd name1
        lastName2 = snd name2
 
--sortBy compareLastNames names
*Main> names
[("Ian","Curtis"),("Bernard","Sumer"),("Peter","Hook"),("Stephen","Morris")]
*Main> sort names
[("Bernard","Sumer"),("Ian","Curtis"),("Peter","Hook"),("Stephen","Morris")]
*Main> sortBy compareLastNames names
[("Ian","Curtis"),("Peter","Hook"),("Stephen","Morris"),("Bernard","Sumer")]

並び替えOKでした。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-09-28 (土) 19:17:35 (1665d)