Get-Programming-with-Haskell_Lesson_4
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[Haskell]] > 本 > [[入門Haskellプログラミング]] > LES...
#contents
*入門Haskellプログラミング [#p6a98c15]
#html{{
<table border="0" cellpadding="5"><tr><td valign="top"><a...
<td> </td>
<td valign="top"><a href="https://www.amazon.co.jp/exec/o...
}}
**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"),(...
*Main> sort names
[("Bernard","Sumer"),("Ian","Curtis"),("Peter","Hook"),(...
*Main> sortBy compareLastNames names
[("Ian","Curtis"),("Peter","Hook"),("Stephen","Morris"),...
並び替えOKでした。
終了行:
[[Haskell]] > 本 > [[入門Haskellプログラミング]] > LES...
#contents
*入門Haskellプログラミング [#p6a98c15]
#html{{
<table border="0" cellpadding="5"><tr><td valign="top"><a...
<td> </td>
<td valign="top"><a href="https://www.amazon.co.jp/exec/o...
}}
**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"),(...
*Main> sort names
[("Bernard","Sumer"),("Ian","Curtis"),("Peter","Hook"),(...
*Main> sortBy compareLastNames names
[("Ian","Curtis"),("Peter","Hook"),("Stephen","Morris"),...
並び替えOKでした。
ページ名: