#author("2019-09-28T09:59:09+00:00","default:sagasite","sagasite")
[[Haskell]] > 本 > [[入門Haskellプログラミング]] > LESSON 3

#contents

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

#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 3 [#z4050761]
- Haskellでのラムダ関数の記述
- ラムダ式を使った特別な関数の定義
- レキシカルスコープ
- ラムダ関数によるスコープの作成

*3.1 ラムダ関数 [#we8ebc09]
書式
 \x -> x

-最初にバックスラッシュ「\」を書く。(Windowsパソコンの場合、バックスラッシュ記号が円マーク「¥」で表示される場合もある)
-続いて、引数を書く。上記の書式では、左側の「x」の部分のこと。
-続いて、「->」という記号を書く。
-続いて、関数の本体を書く。上記の書式では、右側の「x」の部分のこと。

本書、p.26の図3-1には間違いがある。
「関数の引数(複数の場合もある)」から伸びている線は、右側のxに向かっているが、正しくは左側のxに向かっていなければならない。

//----------------------------------------
// 2019年9月17日21:33:19
//----------------------------------------

ラムダ関数の書き方の例
 Prelude> (\x -> x * 2) 4
 8

型を確認してみます。
 Prelude> :t (\x -> x)
 (\x -> x) :: p -> p

 Prelude> :t (\x -> x * 2)
 (\x -> x * 2) :: Num a => a -> a

* 3.2 where句 [#nd40ab14]

(参考)
- Haskell-補助関数 CapmNetwork http://capm-network.com/?tag=Haskell-%E8%A3%9C%E5%8A%A9%E9%96%A2%E6%95%B0

>補助関数とは、関数定義の内部でのみ使用する部分的な関数のことです。
補助関数を作成することで、複雑で分かりにくいプログラムの構造を簡潔にして可読性を向上することができます。
また、処理毎に分割することはプログラムを再利用しやすく、保守性のあるものにします。
なお、補助関数を内包する親となる関数は「最上位関数」と呼ばれます。
Haskellにおける補助関数の定義方法は「let」と「where」の2通りありますが、whereを使うほうが一般的といえます。
どちらを使用しても問題ありませんが、混在していると可読性が悪くなるため、統一して利用することが推奨されています。

//----------------------------------------
// 2019年9月28日18:57:11
//----------------------------------------

* 3.3 let式 [#ba2b2533]
(p.29)
>Haskellには、where句の代わりに使用できるlet式と呼ばれるものがあります。

**where句とlet式の違いは? [#x54e10da]
素朴な疑問です。

-Haskell個人メモ :: 3.関数の構文 - Qiita https://qiita.com/YusukeHosonuma/items/5da9847db16d33f27a06

>''基本''
let 変数/関数 in 式という書式で、ローカルな変数や関数を定義できる。
letは式なので結果を返す。

>''whereとの違い''
whereと似ているが以下の点が異なる。
- どこでも書ける。
- whereではガードをまたぐことが出来るが、letで定義したものはinの中でしか参照できない。

>好みの問題もあるが、基本的にはwhereを使って、必要な場合はletを使うのが良さそう。

「ガード」による違いがあるみたいですね。
基本はwhereを使っておくことにしておきたいと思います。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS