#author("2019-09-28T15:41:18+00:00","default:sagasite","sagasite")
#author("2019-09-28T16:03:26+00:00","default:sagasite","sagasite")
[[Haskell]] > 本 > [[入門Haskellプログラミング]] > LESSON 4

#contents

*入門Haskellプログラミング [#p6a98c15]

#html{{
<table border="0" cellpadding="5"><tr><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4798158666/vertex9-22/" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/51o1oUqjsvL._SL160_.jpg" border="0"></a></td>
<td> </td>
<td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4798158666/vertex9-22/" target="_blank">入門Haskellプログラミング</a><br>Will Kurt<br>翔泳社<br>2019-07-31<br>¥ 4,104</td></tr></table>
}}

**LESSON 4 [#ha872b3a]
レッスン4で学ぶ内容
- ファーストクラス関数の定義
- 関数を他の関数への引数として使用する方法
- 関数の計算を抽象化する方法
- 関数を値として返す方法

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

#code(haskell){{
-- ファーストクラス関数
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

** 関数は演算子よりも優先順位が高い [#b059d094]
 *Main> inc 2 * 3
 9

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

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

**カスタムソート [#rca38ba2]
関数を他の関数に渡す用途の1つはソートです。

#code(haskell){{
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