1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Haskell勉強メモ Down

Posted at

Haskellの知識を深めたかったので、Hackageを適当に眺めて知らない型がないか探していました。今回はその中からDownについて調べたので、自分なりにメモしておこうと思います。

Down

Downは逆順ソートなどに用いられる型のようです。Data.Ordで定義されています。

SortOnと組み合わせると、シンプルに逆順ソートを実装できます。

逆順ソートの例
import Data.Ord
import Data.List

tekitou = [1,345,3,624,724,7,13,634,62,6,23,62,4562]

main = do
 print (sortOn Down tekitou) --シンプルに書ける
 print (sortBy (comparing Down) tekitou) --速度はこちらのほうが速いらしい
結果
[4562,724,634,624,345,62,62,23,13,7,6,3,1]
[4562,724,634,624,345,62,62,23,13,7,6,3,1]

Down aにはaとは逆の大小関係が定義されています。以下、https://hackage.haskell.org/package/base-4.17.0.0/docs/src/Data.Ord.html より引用です。

-- | @since 4.6.0.0
instance Ord a => Ord (Down a) where
    compare (Down x) (Down y) = y `compare` x

確かに、逆になっていますね。

Monad Down

DownMonadのインスタンス(従ってFunctorApplicativeのインスタンス)です。以下、https://hackage.haskell.org/package/base-4.17.0.0/docs/src/Data.Ord.html より引用です。

-- | @since 4.11.0.0
instance Functor Down where
    fmap = coerce

-- | @since 4.11.0.0
instance Applicative Down where
    pure = Down
    (<*>) = coerce

-- | @since 4.11.0.0
instance Monad Down where
    Down a >>= k = k a

私はここで初めてcoerceという関数を知りました。現状あまり理解していませんが、同じような型同士を変換する関数のようです。おそらくfmap = coerceの場合、fmap f (Down x) = Down (f x)と同じ意味だと思います。aDown aはほとんど同じなので、自動的に変換できるということでしょうか。

一応do記法でDownMonadであることを見てみます。

何の意味があるのかはわからない例
import Data.Ord

f :: Num a => Down a -> Down a -> Down a
f x y = do
 a <- x
 b <- y
 return (2*a+3*b)
 
main = do
 let x = Down 1
 let y = Down 2
 print (f x y)
結果
Down 8

DownMonadのインスタンスであることはわかりましたが、Monadのインスタンスであることを上手く利用した例はあるのでしょうか? (単に定義できるから定義しているだけ?)Monadの具体例をなるべく多く知りたい気持ちがあるので、少し気になっています。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?