PureScriptの(_)で関数を作る
一貫性があるので全ての具体例を見なくてもノリがわかると思うmrsekut.icon
_が関数を作る
_の個数分の引数を取る関数を作る
以下、具体例
関数
code:spago
double = (2 * _)
dboule 10
20
以下と同じ
code:spago
double n = n * 2
psではdouble = (*2)とは書けないmrsekut.icon
_でRecordを作成する関数を作る
{ x: _ }自体が1引数関数になっている
code:spago
{ x: _ } :: ∀ a. a -> { x :: a }
これは以下と同じ
code:spago.hs
\a -> { x: a }
code:spago
f1 = { x: _ }
f1 1
{ x: 1 }
f2 = {x:_, y: "hoge"}
f2 "piyo"
{ x: "piyo", y: "hoge" }
_の数だけ引数を取る
code:spago
f3 = { x:_, y: _ }
f3 1 2
{ x: 1, y: 2 }
_でRecordのアクセッサーを作る
xfieldにアクセスする関数
code:spago
:t _.x :: ∀ a r. { x :: a | r } -> a
code:spago
g1 = _.x
g1 { x: 10, y: 100 }
10
ネストしててもいい
code:spago
g2 = _.x.z
g2 { x: { z:2 }, y: 100 }
2
Recordを更新する関数を作る
受け取ったrecordのxfieldを42に更新する関数
code:spago
:t _ { x = 42 } :: ∀ r a. { x :: a | r } -> { x :: Int | r }
HalogenのhandleActionの中でよく見る形(後述)mrsekut.icon
より一般化する
code:spago
:t _ { x = _ } :: ∀ a r v. { x :: v | r } -> a -> { x :: a | r }
u = _ { x = _ }
u { x:100 } 200
{ x: 200 }
if式に使う
code:spago
:t if _ then Just 42 else Nothing
Boolean -> Maybe Int
b = if _ then Just 42 else Nothing
b true
Just 42
switch式に使う
code:purs(hs)
f :: Int -> String
f = case _ of
0 -> "None"
1 -> "One"
_ -> "Some"
以下と同じ
code:purs(hs)
f :: Int -> String
f n = case n of
0 -> "None"
1 -> "One"
_ -> "Some"
case .. ofの中に関数があると使えない
これだとエラーになる↓
code:purs(hs)
g :: Int -> Int
g x = x + 10
f :: Int -> String
f = case g _ of
0 -> "None"
...
地味に一貫性がない
<#>と組み合わせる
良い実用例
code:purs(hs)
handleAction :: Action -> H.HalogenM State Action () output m Unit
handleAction = case _ of
SetValue v -> H.modify_ _ { value = v }
以下と同じ
code:purs(hs)
handleAction :: Action -> H.HalogenM State Action () output m Unit
handleAction action = case action of
SetValue v -> H.modify_ \st -> st { value = v }
参考