BETA

Prelude モジュールを読む (1) Data.Unit, Data.Functor

投稿日:2019-10-31
最終更新:2019-11-10

Prelude モジュールを読む (1) Data.Unit, Data.Functor

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

Preludeではいくつかのモジュールがre-exportされているだけなので個別に確認します。
今回は以下の2つです。

  • Data.Unit
  • Data.Functor

Data.Unit

PureScript Haskell
Unit ()
unit ()

Unit 型と unit 値

foreign import data Unit :: Type  

foreign import unit :: Unit  

exports.unit = {};  

Data.Functor

PureScript Haskell
map, <$> fmap, <$>
void Data.Functor.void
flap, <@> Control.Lens.Lens.(??) (lens)
(<$) (<$)
(<#>) Data.Functor.(<&>)
($>) Data.Functor.($>)

Functor 型クラス, map (<$>)

class Functor f where  
  map :: forall a b. (a -> b) -> f a -> f b  

infixl 4 map as <$>  

Haskellではfmapとして定義されています。

void

void :: forall f a. Functor f => f a -> f Unit  
void = map (const unit)  

flap (<@>)

flap :: forall f a b. Functor f => f (a -> b) -> a -> f b  
flap ff x = map (\f -> f x) ff  

infixl 4 flap as <@>  

知らないやつ出てきました・・・。Haskellではlensに同じ型の(??)という演算子が定義されていますね。

なるほど、flipの一般化されたやつという感じですか。

(??) :: Functor f => f (a -> b) -> a -> f b   
-- f = (->) r として具体化すると  
  ((->) r (a -> b)) -> a -> ((->) r b)  
= (r -> (a -> b)) -> a -> (r -> b)  
= (r -> a -> b) -> (a -> r -> b)  
= flip   

確かに!結構面白いですね。

> Just (+) <@> 5 <@> 10  
(Just 15)  

(<$)

voidRight :: forall f a b. Functor f => a -> f b -> f a  
voidRight x = map (const x)  

infixl 4 voidRight as <$  

(<#>)

mapFlipped :: forall f a b. Functor f => f a -> (a -> b) -> f b  
mapFlipped fa f = f <$> fa  

infixl 1 mapFlipped as <#>  

Haskellだと<&>として定義されています。

($>)

voidLeft :: forall f a b. Functor f => f a -> b -> f b  
voidLeft f x = const x <$> f  

infixl 4 voidLeft as $>  

感想

色々と勉強になりますね。頑張って全部読もう。

参考リソース

進捗

  • 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
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

PureScript のお勉強 (未来の自分に向けて書いています)

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう