2013-11-26 89 views
2

說我有以下類型類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不依賴於最終的類型參數。

+0

可不可以給你打算如何使用此些方面?我非常肯定可以很簡單地實現你所需要的,儘管它看起來不像你寫的。 – leftaroundabout

回答

5

你可以做一個獨立的家庭類型

type family MassType (r :: * -> *) 
type instance MassType (Reasoner l as) = as 
+0

這個簡單的答案讓我重新思考了我設計我的類型的方式,然後讓我找到了一個可行的解決方案。謝謝。 – bstamour

+0

我很高興,不客氣:) –