說我有以下類型類Haskell的種類和類型約束
class Silly (t :: * -> *) where
-- details
我希望能夠表達以下約束,但我不知道,如果它甚至有可能。
class (Silly s) => Willy (s t) where
-- details
基本上我想對類型構造函數,而不是整個類型的約束。這甚至可以表達嗎?我甚至不知道這種限制會被調用,所以Google一直沒有幫助。
編輯:我有一個數據類型
data Reasoner logic atoms a = Reasoner { unReasoner :: MassAssignment atoms -> a }
有一個Applicative
實例。我最初是爲了與這些推理更容易一點的工作有一個run
功能,但因爲我要帶applicatives的自由組合性的優勢,我定義包含run
而不是一個類型的類,ALA
class RunReasoner r where
type MassType r
type ResultType r
run :: r -> MassType r -> ResultType r
與以下情況
instance RunReasoner (Reasoner l as a) where
type MassType (Reasoner l as a) = MassAssignment as
type ResultType (Reasoner l as a) = a
run = -- details
instance (RunReasoner (r2 t)) => RunReasoner (Compose (Reasoner l1 as1) r2 t) where
type MassType (Compose (Reasoner l1 as1) r2 t) = MassAssignment as1
type ResultType (Compose (Reasoner l1 as1) r2 t) = r2 t
run = -- details
,這樣我可以編寫代碼如
expression `run` mass1 `run` mass2 `run` ... `run` massN
這一切有益於MO st部分,但我現在正在用其他方式編寫reasoners,並且寧願MassType只能從類型構造函數Reasoner l as
獲得,而不必擁有完整類型實例Reasoner l as a
。因此,我正在考慮將RunReasoner
類型類拆分爲兩個類,因爲MassType不依賴於最終的類型參數。
可不可以給你打算如何使用此些方面?我非常肯定可以很簡單地實現你所需要的,儘管它看起來不像你寫的。 – leftaroundabout