んむて(@nnm_tech)さん | Twitterと第四回すごいH本の原書を読む会を開催しました!
- 今回も開催場所はラクスルさんの会議室をお借りしました。ありがとうございました。
第五回から参加したい方、輪読担当やりたい方大歓迎です
実施内容
読んだ内容
以下、第三回目のノートです。
- 3章Types and TypeclassesのType variablesから3章の最後までやりました。
Haskell以外で出た話題を以下に書き留めます。
- 他の言語では==, +, -, *, /などの演算子はどのように実現しているか。
- Python, C#,C++などのオブジェクト指向言語ではメソッドの糖衣構文として実現されている
- そのため、それらの演算子をオーバーロードすると演算子の挙動を変更できる
LT
今回は私が、今世間を騒がせているパイプライン演算子について説明しました。 以下、資料
F#のパイプライン演算子
let add x y = x + y // add : x:int -> y: int -> int
let mul x y = x * y // mul : x:int -> y: int -> int
let display = printfn "number is %d" // display : int -> unit
display(mul 2 (add 5 10))
10 |> add 5 |> mul 2 |> display
let (|>) arg f = f arg
- F#では中置演算子が定義可能、カリー化が標準組み込みされているのでパイプライン演算子が、標準の言語仕様内で実装可能
- Elixirは中置演算子が定義不可、カリー化もされないので、マクロによるAST変換により実現
Rubyのパイプライン演算子
class A
def initialize(n)
@n = n
end
def add(n)
@n = @n + n
self
end
def mul(n)
@n = @n * n
self
end
def display
puts "number is " + @n.to_s
end
end
A.new(10).add(5).mul(2).display()
A |> new 10 |> add 5 |> mul 2 |> display
- Rubyのパイプライン演算子はF#ともElixirとも異なる
- 単にメソッドチェーンがパイプライン演算子で書き換えられるだけなので有効なユースケースがあるか
Haskellでのパイプライン演算子
add x y = x + y
mul x y = x * y
display n = putStrLn ("number is " ++ show n)
display(mul 2 (add 5 10))
display $ mul 2 $ add 5 $ 10 -- ($) :: (a -> b) -> a -> b
import Data.Function
10 & add 5 & mul 2 & display -- (&) :: a -> (a -> b) -> b
(|>) arg f = f arg
10 |> add 5 |> mul 2 |> display
元ネタ
LTで参加者から出てきた話題
- ECMAScriptにもパイプライン演算子のプロポーザルが上がっている
- JavaScriptで関数型っぽく書く
- C++のパイプライン演算子ではなくパイプラインの話
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1261r0.pdf
- Rubyでコンビネータ