Haskell~教養としての関数型プログラミング~を使って勉強
今回 学ぶこと
コマンド | 説明 |
---|---|
stack ghci | Haskellを対話モードで起動 |
:load path_to_file | ファイルを読み込む |
:reload | ファイルを再読み込みする |
it | 直前に参照した値を取得する |
funct arg1 arg2 ... | 定義済関数の呼び出し |
- 関数の定義
practice.hs
-- 引数1と引数2の乗算
func arg1 arg2 = arg1 * arg2
-- 部分適用の関数
abcCrypt n ed mc = mc ^ ed `mod` n
-- abcCryptの第一引数だけ与える
abcCrypt1 = abcCrypt 138689
-- abcCryptの第一引数, 第二引数を与える
encrypt1 = abcCrypt1 13
decrypt1 = abcCrypt1 95497
------------------------------
- 部分関数
部分関数は外側の関数から内側の関数へ順次展開されていく
実践
コマンドラインを管理者モードで起動する
# 対話モード起動
C:\Users\ユーザー名\Documents\haskell>stack ghci
# 対話モード終了
C:\Users\ユーザー名\Documents\haskell>:quit
準備運動
コマンドプロンプトを管理者モードで実行し作業ディレクトリへ移動する
# ユーザーホームへ移動
cd %HOMEPATH%
# 対話モード起動
C:\Users\ユーザー名\Documents\haskell>stack ghci
*Main Funpaala> 123
123
Prelude> "hello haskell"
"hello haskell"
*Main Funpaala> pi
3.141592653589793
*Main Funpaala> 123 + 123
246
# 変数itに直前に評価した値が格納されている
*Main Funpaala> it
246
*Main Funpaala> repeat "Hello 2020"
# Hello 2020が延々と出力されるのでctrl + cで強制終了しましょう
practice/fruits.hsファイルを作成してみる
fruits.hs
myFavoriteFruit = "orange"
ファイルを作成したらファイルをロードする
*Main Funpaala>:load practice/fruits.hs
[1 of 1] Compiling Main ( practice\fruits.hs, interpreted )
Ok, modules loaded: Main.
# 変数を読み込んでみる
*Main> myFavoriteFruit
"orange"
ファイルを編集
fruits.hs
myFavoriteFruit = "banana"
# ファイルをリロード
*Main> :reload
[1 of 1] Compiling Main ( practice\fruits.hs, interpreted )
Ok, modules loaded: Main.
# 変数を読み込む
*Main> myFavoriteFruit
"banana"
RSA暗号の計算式
# 管理者モードでgit bashを起動
$ stack ghci
# 2の10乗を求める
*Main> 2 ^ 10
1024
# 13/5の剰余を求める
Prelude> 13 `mod` 5
3
Haskellで暗号化と復号化の式
c : 暗号化されたメッセージ
m : 復号化したメッセージ
# 暗号化
c = m ^ e `mod` n
# 復号化
m = c ^ d `mod` n
RSA暗号 実践
- 変数定義
rsa.hs
e = 13
d = 95497
n = 138689
-- 引数m を暗号化
encrypt m = m ^ e `mod` n
-- 引数c を復号化
decrypt c = c ^ d `mod` n
- ファイルを読み込む
Prelude> :load rsa.hs
[1 of 1] Compiling Main ( rsa.hs, interpreted )
Ok, one module loaded.
- 暗号化
*Main> encrypt 1001
90875
- 復号化
*Main> decrypt 90875
1001