Help us understand the problem. What is going on with this article?

Haskellことはじめ

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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away