當我被卡住時,我剛剛開始和哈斯克爾一起玩。Haskell中讀類的實例
我試圖讓我的新數據類型(我們稱之爲MyType
)Read
類的實例。 Mytype
是一個類型構造函數,所以它需要另一個類型作爲參數。我想寫這種代碼
instance (Read a) => Read (MyType a) where
readsPrec _ r = [foo (read r :: a), r]
,但它給了我下面的錯誤
Could not deduce (Read a2) arising from a use of `read' from the context (Read a).
我想,既然一個是Readable
我可以推斷出它,但顯然我錯了。有任何想法嗎?
編輯: 我已經改變了以前的代碼
readsPrec _ r = [foo (read r :: a), ""]
,所以如果我輸入:read "myString" :: MyType a
它完美的罰款。 現在我希望如果在上下文中使用read "myString"
,我不應該指定要讀取的類型。但問題是,隨着
bar (read myString) a
其中bar:: MyType a -> a -> MyType a
,我 Ambiguos變量類型。
是否有可能做這樣的事情而沒有得到那種類型的錯誤?
我希望現在更清楚,我試圖簡化代碼,但我希望我沒有忽略任何關鍵的東西。如果寫成
instance (Read a) => Read (MyType a) where readsPrec _ r = [(foo (read r),r)]
如果foo
具有類型a -> MyType a
請在此給出foo的類型,只是爲了完整。 –
foo,它實際上是一個解析器,它在我試圖簡化的代碼中更復雜一些。現在它實際上編譯即使沒有ScopedTypeVariables,但正如你在另一篇文章中說的,我可能誤解了readPresc的工作方式,因爲現在我得到了 異常:Prelude.read:沒有解析 當我嘗試讀取一個字符串爲MyType。 – user1544128
好的,所以在我的情況下是正確的應該是[富(讀r :: a),「」],希望將有助於其他一些新手:) – user1544128