2017-05-29 123 views
1

我真的不知道下面的代碼有什麼問題。Haskell中的剛性類型變量

data TypeA = TypeA 

class MyClass a where 
    myClassFunction :: a -> String 

instance MyClass TypeA where 
    myClassFunction TypeA = "TypeA" 

bar :: (MyClass a) => String -> a 
bar "TypeA" = TypeA 

我收到以下錯誤:

Couldn't match expected type ‘a’ with actual type ‘TypeA’ 
     ‘a’ is a rigid type variable bound by 
      the type signature for bar :: MyClass a => String -> a 
      at test.hs:9:8 
    Relevant bindings include 
     bar :: String -> a (bound at test.hs:10:1) 
    In the expression: TypeA 
    In an equation for ‘bar’: bar "TypeA" = TypeA 
Failed, modules loaded: none. 

我怕我失去了一些東西約Haskell的類型系統是至關重要的。

+0

該代碼的目標是什麼? –

+0

@BartekBanachewicz主要嘗試使用Haskell類型系統和動態調度(我不確定這是這裏的情況) – Saczew

+0

從問題中不清楚你想要動態調度,不。 –

回答

4
(MyClass a) => String -> a 

沒有明顯的方式,例如,以返回Int類型的值(再次,假定MyClass Int定義)表示函數可以返回任何a類型這是一個從它要求。您的實施返回滿足該限制的一個特定類型。這是明確的簽名更明顯:

bar :: forall a. (MyClass a) => String -> a 

清楚地讀出,這是每種類型a滿足MyClass,此功能將一個字符串,並返回該類型的值。 您的版本將代替exists a

+0

那麼如何實現在他的問題中定義的簽名OP? – Glubus

+0

@Glubus我不認爲這甚至是可能的。 'MyClass'提供了一種將值減少到'String'的方法,但不是構造'a'類型的新值的方法。問題定義在這裏是錯誤的。 –

+0

有沒有一種方法可以在Haskell中實現類似「動態」調度的功能?我的意思是我想在運行時選擇功能。我認爲如果我像TypeA = ValueA |那樣定義,這將是最簡單的VALUEB。我只是好奇。 – Saczew

3

函數類型MyClass a => String -> a指示可以返回調用者的選擇的任何類型的值(具有MyClass的實例)的函數。給定的值TypeA