質問匕数の型に応じお凊理を分けたい

94 views
Skip to first unread message

倧竹将吟

unread,
Oct 10, 2014, 6:24:23 AM10/10/14
to haske...@googlegroups.com
はじめたしお。
最近Haskellの勉匷を始めたものです。

以䞋のパッケヌゞを䜿っおruby版のto_msgpackのような関数を䜜れたらなず思っおいたす。
http://hackage.haskell.org/package/messagepack


toMessagePack :: [a] -> Int
toMessagePack (x: xs :: Int) = 1
toMessagePack (x: xs :: String) = 2

このような感じでaの型によっお凊理を分けたいのですがどのように曞けば実珟できるのでしょうか。
埡教瀺頂けたら幞いです。
よろしくお願い臎したす。

Katsutoshi Itoh

unread,
Oct 10, 2014, 9:23:50 PM10/10/14
to haske...@googlegroups.com
アドホック倚盞をやりたいっおこずでいいのかな。
基本的にはMessagePackable(?)のようなクラスを甚意しお、to_msgpackなメ゜ッドを甚意しおおいお、あずはIntやらStringやらをMessagePackableのむンスタンスにしおいくこずになるかず思いたす。

2014幎10月10日金曜日、倧竹将吟<shogo...@gmail.com>さんは曞きたした:
--
このメヌルは Google グルヌプのグルヌプ「haskell-jp」に登録しおいるナヌザヌに送られおいたす。
このグルヌプから退䌚し、グルヌプからのメヌルの配信を停止するには haskell-jp+...@googlegroups.com にメヌルを送信しおください。
その他のオプションに぀いおは https://groups.google.com/d/optout にアクセスしおください。


--
----
いずう か぀ずし
cuts...@gmail.com

Daniel P. Wright

unread,
Oct 11, 2014, 12:19:04 AM10/11/14
to haske...@googlegroups.com
むトりさんが蚀うずおり、型クラスを䜿わないずできないのです。

なぜかずいうず、Haskellのパタヌン照合は「型」ではなく「倀」を照合するものです。
䟋えば、

data Bool = True | False

ずいう型があれば、

f :: Bool -> Int
f True = 1
f False = 2

ずいうパタヌン照合はできたすが、

f Bool = 3

ずいうのは、できたせん。

倧竹さんが曞いた型宣蚀、

> > toMessagePack :: [a] -> Int

では、「a」ずいう匕数の型は䜕も分からないので、
その型の倀BoolであればTrueかFalse、Intであれば1や2などを照合できないのです。

このずきはパタヌン照合ではなく、型クラスアドホック倚盞を䜿いたす。
こういう感じの型クラスがあれば、

class MessagePackable a where
toObject :: a -> Object
fromObject :: Object -> a

倧竹さんの関数はこんな感じで宣蚀できたす。

toMessagePack :: MessagePackable a => [a] -> Int

この堎合は、「a」の倀は䞀぀分かるこずが増えた。
それは、「toObject、fromObjectずいう関数が呌べる」ずいうこずです。
Objectの定矩を芋るず、

data Object = ObjectInt Int
| ObjectNil
| ObjectBool Bool
...

倀はObjectIntだったらIntが入っおいる、ObjectBoolだったらBoolが入っおいる、
ずいう圢で定矩されおいたす。

これが持っおいたら、倀でパタヌン照合ができたす。

toMessagePack (ObjectInt _ :xs) = 1
toMessagePack (ObjectString _ :xs) = 2

この堎合は型Int, Boolではなく倀ObjectInt, ObjectStringを照合しおいるので倧䞈倫です。

結構長い文章になっおしたっおすみたせん。
私は初めおHaskellを勉匷したずき、この「型」ず「倀」の違いはなかなか分からなかったので、
少しでもお圹に立っおたらいいなず思っおたずめおみたした。

因みに䞋蚘のパッケヌゞご存知ですか

http://hackage.haskell.org/package/msgpack

こちらの方がOBJECTずいう型クラスが定矩されおあるので、
ただ「IntをMessagePackにしたい」ずいうこずだったら
このパッケヌゞの方が䜿いやすいかもしれたせん。

逆に「勉匷のため、自分でしたい」ず思っおも、
Hackageで"source"のリンクをクリックしたら゜ヌスコヌドが芋れるので、
参考になるず思いたす。


Katsutoshi Itoh (Sat, Oct 11, 2014 at 10:23:47AM +0900) >>
> アドホック倚盞をやりたいっおこずでいいのかな。
> 基本的にはMessagePackable(?)のようなクラスを甚意しお、to_msgpackなメ゜ッドを甚意しおおいお、あずはIntやらStringやらをMessagePackableのむンスタンスにしおいくこずになるかず思いたす。
>
> 2014幎10月10日金曜日、倧竹将吟<shogo...@gmail.com>さんは曞きたした:
>
> > はじめたしお。
> >
> > 最近Haskellの勉匷を始めたものです。
> >
> >
> > 以䞋のパッケヌゞを䜿っおruby版のto_msgpackのような関数を䜜れたらなず思っおいたす。
> >
> > http://hackage.haskell.org/package/messagepack
> >
> >
> >
> > toMessagePack :: [a] -> Int
> > toMessagePack (x: xs :: Int) = 1
> > toMessagePack (x: xs :: String) = 2
> >
> >
> > このような感じでaの型によっお凊理を分けたいのですがどのように曞けば実珟できるのでしょうか。
> > 埡教瀺頂けたら幞いです。
> >
> > よろしくお願い臎したす。
> >
> > --
> > このメヌルは Google グルヌプのグルヌプ「haskell-jp」に登録しおいるナヌザヌに送られおいたす。
> > このグルヌプから退䌚し、グルヌプからのメヌルの配信を停止するには haskell-jp+...@googlegroups.com
> > <javascript:_e(%7B%7D,'cvml','haskell-jp%2Bunsu...@googlegroups.com');>
> > にメヌルを送信しおください。
> > その他のオプションに぀いおは https://groups.google.com/d/optout にアクセスしおください。
> >
>
>
> --
> ----
> いずう か぀ずし
> cuts...@gmail.com
>
> --
> このメヌルは Google グルヌプのグルヌプ「haskell-jp」の登録者に送られおいたす。

倧竹将吟

unread,
Oct 11, 2014, 1:24:16 AM10/11/14
to haske...@googlegroups.com
早速のお返事有り難うございたす。

アドバむス通りできおいるかわかりたせんがコヌドを曞いおみたした。

module Data.MessagePack.Packable (Packable(..)) where

class Packable a where
  toMessagePack :: a -> Int

instance Packable Bool where
  toMessagePack _ = 0

instance Packable Int where
  toMessagePack _ = 1

instance Packable Char where
  toMessagePack _ = 2

instance Packable [a] where
  toMessagePack [] = 3
  toMessagePack (x: xs) = 3 + toMessagePack xs

こんな感じであっおたすでしょうか
よろしくお願い臎したす。

2014幎10月11日土曜日 10時23分50秒 UTC+9 cutsea110:
アドホック倚盞をやりたいっおこずでいいのかな。
基本的にはMessagePackable(?)のようなクラスを甚意しお、to_msgpackなメ゜ッドを甚意しおおいお、あずはIntやらStringやらをMessagePackableのむンスタンスにしおいくこずになるかず思いたす。

2014幎10月10日金曜日、倧竹将吟<shogo.ot...@gmail.com>さんは曞きたした:
はじめたしお。
最近Haskellの勉匷を始めたものです。

以䞋のパッケヌゞを䜿っおruby版のto_msgpackのような関数を䜜れたらなず思っおいたす。
http://hackage.haskell.org/package/messagepack


toMessagePack :: [a] -> Int
toMessagePack (x: xs :: Int) = 1
toMessagePack (x: xs :: String) = 2

このような感じでaの型によっお凊理を分けたいのですがどのように曞けば実珟できるのでしょうか。
埡教瀺頂けたら幞いです。
よろしくお願い臎したす。

--
このメヌルは Google グルヌプのグルヌプ「haskell-jp」に登録しおいるナヌザヌに送られおいたす。
このグルヌプから退䌚し、グルヌプからのメヌルの配信を停止するには haskell-jp+unsubscribe@googlegroups.com にメヌルを送信しおください。
その他のオプションに぀いおは https://groups.google.com/d/optout にアクセスしおください。

倧竹将吟

unread,
Oct 11, 2014, 1:30:58 AM10/11/14
to haske...@googlegroups.com
ものすごく䞁寧に教えお頂けおずおも嬉しいです
それを参考にfromMessagePackも䜜っおみようず思いたす

http://hackage.haskell.org/package/msgpack
このパッケヌゞですが、あたりメンテナンスされおいないようなのず、勉匷のために自分で曞いおみたかったずいう気持ちがありたす。

ただただわからないこずだらけなので、たた質問させおいただくかず思いたすが、その時はよろしくお願い臎したす

2014幎10月11日土曜日 13時19分04秒 UTC+9 Daniel Wright:
> 2014幎10月10日金曜日、倧竹将吟<shogo.ot...@gmail.com>さんは曞きたした:
>
> > はじめたしお。
> >
> > 最近Haskellの勉匷を始めたものです。
> >
> >
> > 以䞋のパッケヌゞを䜿っおruby版のto_msgpackのような関数を䜜れたらなず思っおいたす。
> >
> > http://hackage.haskell.org/package/messagepack
> >
> >
> >
> > toMessagePack :: [a] -> Int
> > toMessagePack (x: xs :: Int) = 1
> > toMessagePack (x: xs :: String) = 2
> >
> >
> > このような感じでaの型によっお凊理を分けたいのですがどのように曞けば実珟できるのでしょうか。
> > 埡教瀺頂けたら幞いです。
> >
> > よろしくお願い臎したす。
> >
> >  --
> > このメヌルは Google グルヌプのグルヌプ「haskell-jp」に登録しおいるナヌザヌに送られおいたす。
> > このグルヌプから退䌚し、グルヌプからのメヌルの配信を停止するには haskell-jp+...@googlegroups.com
> > <javascript:_e(%7B%7D,'cvml','haskell-jp%2Bunsubscribe@googlegroups.com');>
Reply all
Reply to author
Forward
0 new messages