7

数時間前、私は GHC HEAD を構築して、新しい光沢のある閉じた型ファミリを実験しました。

{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances #-}

type family C a b where
  C  a [a] = [a]
  C  a  a  = [a]

今、私はC使用しようとしています:

class Combine a b where
  combine :: a -> b -> C a b

instance Combine a [a] where
  combine a b = a : b

instance Combine a a where
  combine a b = [a, b]

次のエラーが発生します。

Couldn't match expected type ‛C a a’ with actual type ‛[a]’
...
In the expression: [a, b]
In an equation for ‛combine’: combine a b = [a, b]
In the instance declaration for ‛Combine a a’

2 番目の方程式は最初の方程式とは離れているように思えます (何があって[a] aも に単純化することはできません)。a aa

4

1 に答える 1

7

メールアーカイブを少し調べてみました。残念ながら、この種のナンセンスが受け入れられているためa ~ b、可能性を排除していないようです。a ~ [b]

type family G = [G]

その結果、たとえばCombine a aを呼び出しC a aて戻り値の型がどうあるべきかを調べる場合、削減はできません。 について何も知らないため、型のor分岐aを選択するかどうかはまだわかりません。家族であり、まだ減らすことはできません。C a aC a [a]C

このメーリング リスト スレッドに詳細が記載されています。このスレッドには、次月のスレッド別アーカイブに多数のフォローアップがあります (前のリンクからは見つけるのが難しいようです) 。より良い解決策が何であるかはわかりませんが、全体の状況は実際には少し奇妙に思えます。

于 2013-10-13T22:57:21.893 に答える