俺がコンパイラに期待したのは、 f :: (Hoo b ~ HooBar) => b の型シグニチャによって、b ~ Bar を類推することだったんですけど、どうもそれがうまく行っていない。 結局、帰結処理で type family や等式制約がどのように処理されるのかの資料は見つからなかったのですが、失敗する理由はわかりました。 この記事に答えがありました。 https://qiita.com/lotz/items/6c038698c8f04f57113a type instance Hoo Bar = HooBar だけでは、それ以外のインスタンス、例えば Hoo () などが HooBar とおなじになる可能性を排せないので、b を一意に決定することができないらしいんです。 型関数が単射であることをコンパイラに伝えれば解決です。言語拡張TypeFamilyDependencies を加え、 - type family Hoo b :: * + type family Hoo b = r | r -> b と書き換えると、>> 485 のプログラムはコンパイルを通ります。 0499デフォルトの名無しさん2018/01/19(金) 07:41:26.43ID:qWabwUd0>>495 リスト本読め 0500デフォルトの名無しさん2018/01/19(金) 15:11:02.24ID:uCK/Ej3G>>450 stack で指定したターゲット以外の余計なものがビルドされてしまう問題は、バグの可能性があります。 https://github.com/commercialhaskell/stack/issues/14060501デフォルトの名無しさん2018/01/20(土) 08:32:17.48ID:lXdHdJ+E Haskellの型コンストラクタがいまいち理解できなかったけど、ラムダキューブでやっと理解できた。 ポリモーフィックな関数と所謂依存型とセットなんだね。
これを通して実現したい機能は、頭部ではなく型制約でオーバーロードしたいというもの。 具体的にはdiagramsパッケージの元で作ったダイアグラムを画像化したい。 同じ関数で Show a も画像化したい。 一見簡単そうなんですけど、普通に合成したダイアグラムの頭部に具体的な型がつかないので、 通常の型クラスのインスタンス化でオーバーロードできない。 instance Show a => Hoo a where ... instance (a ~ Diagram B) => Hoo a where ... -- コンパイルエラー! 0523デフォルトの名無しさん2018/02/03(土) 22:01:25.34ID:GVlapN64 すみません、 Huttonの「プログラミングHaskell」で 学習をしているのですが 練習問題の解答が 著者や役者のサイト等を見ても見当たらなく もし掲載のページを知ってたら教えて下さい。 0524デフォルトの名無しさん2018/02/04(日) 04:24:30.53ID:fRCSu2fr プログラミングHaskell 訳者によるサポートページ http://www.mew.org/~kazu/doc/book/haskell.html > 練習問題の答は、原著者のサポートページにあります。 05255232018/02/04(日) 12:22:57.81ID:VtcsF5YK>>524 すみません。 原著者のサポートページでは回答例を見つける事ができませんでした。 翻訳されていないの新版には回答例が掲載されているようですね。 0526デフォルトの名無しさん2018/02/04(日) 14:14:55.60ID:+WAJGnPT コード例とかならここにあるみたいだけど http://www.cs.nott.ac.uk/~pszgmh/book-old.html 0527デフォルトの名無しさん2018/02/04(日) 19:26:34.09ID:VtcsF5YK>>524>>526
ありがとうございます。 学習の参考にさせて頂きます。 0528デフォルトの名無しさん2018/02/22(木) 01:33:31.18ID:rShSr6qS class Hoo a x :: Hoo a => a -> a y :: (Hoo a => a) -> a x = undefined y = undefined -- f :: a -> a -- f a = x a -- コンパイル通らない g :: a -> a g a = y a -- コンパイル通る。なんでだ -- h = y :: a -> a -- 通らない 05295262018/02/23(金) 11:53:44.22ID:QhNOj82G ghcを8.0.2 から 8.2.2に上げた。 h = y :: a -> a -- 通るようになった 0530デフォルトの名無しさん2018/03/05(月) 00:25:18.18ID:rygpwPFq このコンテストに参加してるHaskellerたったの6人と少ないのでチミたちも参加したまえ