あなたはConfiguration
のすべてのインスタンスがPig c
とCow c
がShow
を実装持って力たいと言っているので、これを行うにしても簡単な方法は、単純にそうように、クラスのコンテキスト内で型家族を制限することです:
{-# LANGUAGE TypeFamilies, FlexibleContexts #-}
class (Show (Pig c), Show (Cow c)) => Configuration c where
data Pig c
data Cow c
data Farm c = Farm { pigs :: [Pig c],
cows :: [Cow c] } deriving (Show)
EDIT:@hammarは彼のコメントで指摘したように
、以前のコードはコンパイルされません。これを解決する方法の1つは、StandaloneDeriving
を使用することです。他の方法はこれです:
これらの2つのアプローチは、あなたがshow
を呼び出す場合、私のアプローチはが可能な制約となります一方、その@のHAMMARのアプローチでは、Configuration
制約が必要になり、あなたにわずかに異なる結果が得られます。
'LANGAUGE'行のために失敗しませんか? –
これはファイル全体ではありません。私はこの質問の目的のためにそれを守った。明らかに、モジュール宣言、ParserCombinators.Parsecインポートなどがあります。 – So8res
私はマットが、LANGUAGEと言っている間、LANGUGEと言っているという事実を意味していたと思います。 –