haskell-ja > Archives > 2012/07/27

2012/07/27 01:06:55 UTCcutsea110
#
runSTのところから急に難しくなった
2012/07/27 01:11:06 UTCcutsea110
#
とりあえず後者のものが何を表現しているか分かったけど、どうも私は根本的に勘違いがあるような気がしてきた。
2012/07/27 01:21:38 UTCcutsea110
#
https://gist.github.com/3185638
#
そもそもクラスを返す関数ってだめだっけ?
#
あーなんかやりたいことが違うな。
#
クラスを返したいんだからlen :: a -> Intじゃ意味がないか。
#
f = len . showは全然別ものでした。無視してください。
2012/07/27 01:38:09 UTCcutsea110
#
ますます初歩的な質問になってきて自分でも怖いんだけど・・・
#
id' :: forall a. a->a / id' x = xこれはOKですよね
#
これは特定の型に決定されていないけど正当ですよね。
#
id' :: forall a. Show a => a -> a / id' x = xこれはShowクラスに制限されたidでクラスを受け取って、クラスを返す関数になっているように見えるけど、
#
そう考えると前者の例でz :: D -> Z aとなっててもかまわないんじゃないか?という風に思えてきたんだけど。
#
z :: D -> Z aじゃなくて z :: (Show a, Z a) => D -> aか。
2012/07/27 02:14:12 UTCsnak
#
z :: (Show a, Z a) => D -> aという型は、zが、(Show a, Z, a)という制約を満たすあらゆるaを返せるという意味になりますが、実際にDから取り出せるのは、Dを構築するときに使ったある特定の型であって、あらゆる型ではありません。
#
実際には、Haskellでは書けませんが、exist a. (Show a, Z a) => D -> aのような型になるのでしょうが、HaskellではExistentialな型に包まないと、このような型を表現できないので、やるならこんな感じでしょうか。https://gist.github.com/3185815
2012/07/27 04:48:16 UTCsnak
#
どちらかというと、z :: D -> forall a. (Show a, Z a) => aという2階の型の関数だけれど、それをそのままは扱えないといった方が良いのかも。
2012/07/27 08:51:29 UTCcutsea110
#
確かに使えるのは使える。定義できるという意味で。でも実際にはフィールドアクセスも不便だし正直使いにくいですね。なんか設計を見直した方がよさそうに思えてきました。。。