Newtype型クラス
構えるほど難しくはないmrsekut.icon
例を眺めればなんとなくわかる
code:purs(hs)
module Newtype where
import Data.Newtype
import Prelude
import Data.Generic.Rep (class Generic)
import Data.Lens.Iso.Newtype (_Newtype)
import Data.Show.Generic (genericShow)
import Data.String (toUpper)
import Effect.Class.Console (log)
newtype Username = Username String
derive instance Newtype Username _
instance Show Username where
show (Username user) = "Username " <> user
user1 :: Username
user1 = Username "mrsekut"
-- > unwrap user1
-- "mrsekut"
-- > wrap "mrsekut" :: Username
-- Username "mrsekut"
例があれなので、Number系の例に書き換えようmrsekut.icon
code:purs(hs)
unwrap <<< wrap = id
wrap <<< unwrap = id
k
over
Functorにおけるmapと同じ
code:purs(hs)
upper :: Username -> Username
upper = over Username toUpper
-- > upper $ Username "mrsekut"
-- Username "MRSEKUT"
over2
2引数版
code:purs(hs)
concat :: Username -> Username -> Username
concat = over2 Username (<>)
-- > concat (Username "mrse") (Username "kut")
-- Username mrsekut
overF
liftしたmap
code:purs(hs)
byDomain :: String -> Array Username -> Maybe Username
byDomain = overF Username <<< find <<< contains <<< wrap
-- (Just Username aaa)
もうちょい見るmrsekut.icon
overF2
under
under2
underF
underF2
op
ala
与えられたnewtypeのコンテキストで、その関数を適用する
code:purs(hs)
ala Multiplicative foldMap 1,2,3,4 -- 24 AdditiveとしてfoldMapを適用する
ala'
alaF
code:purs(hs)
これ、docsに書いている例だが、型エラーになるmrsekut.icon