Prelude モジュールを読む (4) Control.Monad, Data.NaturalTransformation, Data.Eq, Data.Show

Prelude モジュールを読む (4) Control.Monad, Data.NaturalTransformation, Data.Eq, Data.Show

Prelude モジュールは purescript-prelude パッケージで定義されているモジュールです。

今回は以下の4つのモジュールを確認します。

  • Control.Monad
  • Data.NaturalTransformation
  • Data.Eq
  • Data.Show

Control.Monad

PureScript Haskell
Monad Monad
whenM Control.Monad.Extra (extra)
unlessM Control.Monad.Extra (extra)
liftM1 Control.Monad.liftM
ap Control.Monad.ap

Monad 型クラス

class (Applicative m, Bind m) <= Monad m  

instance monadFn :: Monad ((->) r)  
instance monadArray :: Monad Array  

Applicative型クラスとBind型クラスでpure(>>=)が実装されているため、Monad型クラスにはメソッドが無いんですね。

whenM

extraパッケージで定義されてるやつです。whenのモナドバージョン。あると便利。

whenM :: forall m. Monad m => m Boolean -> m Unit -> m Unit  
whenM mb m = do  
  b <- mb  
  when b m  

unlessM

これもextraで定義されてるやつ。

unlessM :: forall m. Monad m => m Boolean -> m Unit -> m Unit  
unlessM mb m =  do  
  b <- mb  
  unless b m  

liftM1

liftM1 :: forall m a b. Monad m => (a -> b) -> m a -> m b  
liftM1 f a = do  
  a' <- a  
  pure (f a')  

ap

ap :: forall m a b. Monad m => m (a -> b) -> m a -> m b  
ap f a = do  
  f' <- f  
  a' <- a  
  pure (f' a')  

Data.NaturalTransformation

自然変換は~>という演算子で実装されているんですね。

PureScript Haskell
NaturalTransformation, (~>)

NaturalTransformation, (~>)

type NaturalTransformation f g = forall a. f a -> g a  

infixr 4 type NaturalTransformation as ~>  

Prelude で定義されているということは PureScript では良く利用するんでしょうか。ちょっとまだ良くわからない・・・。

Data.Eq

PureScript Haskell
Eq Eq
eq,(==) (==)
notEq,(/=) (/=)

Eq 型クラス, eq, (==)

Haskell では ==/= がメソッドになっていますが、PureScript では eq だけなんですね。

class Eq a where  
  eq :: a -> a -> Boolean  

infix 4 eq as ==  

notEq, (/=)

notEq :: forall a. Eq a => a -> a -> Boolean  
notEq x y = (x == y) == false  

infix 4 notEq as /=  

Data.Show

PureScript Haskell
Show Show
show show

Show 型クラス, show

showsPrec関数やshowList(こっちはあまり使わないけど) はメソッドじゃないんですね。

class Show a where  
  show :: a -> String  

感想

(~>)演算子をどのように使えば良いのか気になる。

進捗

  • Control.Applicative
  • Control.Apply
  • Control.Bind
  • Control.Category
  • Control.Monad
  • Control.Semigroupoid
  • Data.Boolean
  • Data.BooleanAlgebra
  • Data.Bounded
  • Data.CommutativeRing
  • Data.DivisionRing
  • Data.Eq
  • Data.EuclideanRing
  • Data.Field
  • Data.Function
  • Data.Functor
  • Data.HeytingAlgebra
  • Data.Monoid
  • ~Data.NaturalTransformation~
  • Data.Ord
  • Data.Ordering
  • Data.Ring
  • Data.Semigroup
  • Data.Semiring
  • Data.Show
  • Data.Unit
  • Data.Void