ソクラテスもどき

最近M氏との対話からネタというか疑問が生まれることが多い。
お前はソクラテスか、…という人はおらんと思うけど、
今回もHaskellで引っかかったネタを。(毎度勝手に書いてごめん)
氏いはく、


型を返す関数は作りたい。


ということらしい。

range :: Particle -> (何か型)

つまり

range (一次元Particle)
 => Double
range (三次元Particle)
 => Vector3

で、

move :: Particle -> Time -> range Particle
(type Time = Int)

見たいな事がしたいらしい?
(ParticleがTime時間後どこに行くのかを求めるとのこと)
さすがにこんな記法はだめじゃろ…
たんにモノによって関数の返る型を変えたいのであれば

move :: Particle p => p r -> Time -> r

Particleがあらかじめrangeの型を保持しておけば
出来るんじゃないのか?
と提案したところ、まぁ、なんかそんな感じかなぁということで
納得してもらえた?ようである。


ただし、こっちはこっちでParticleの形になんだかいやな制限が
加わったような気がしないでもない。
その後で考えたところ、本気で適当な型を返したければ
Data.TypableのTypeRepが使えるし、
任意の型のデータを返したければ
Data.Dynamicの関数群を使えば出来るような気もする。
でもDynamicって正直どうなの?とも思うし、あまりよくないようにも思う。


よく考えると、そもそもその辺の各Particle固有のデータを外に
出さない設計のほう良いのでないか?

move :: Particle -> Time -> Particle
transform :: Particle -> Coordinate

とか、適当に隠蔽するとか。


うーん…今回はよく分からん文章になった。
というか、自分でもなんだか意味がよく分からない。
あかん、全然真理が導き出せてへんで。