LoginSignup
2
0

More than 3 years have passed since last update.

Haskellことはじめ

Last updated at Posted at 2019-12-31

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
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0