2017-05-19 38 views
1

在這裏我問到的問題的精神,(Generically) Build Parsers from custom data types? @danidiaz提供了一個精美的解決方案。generic-sop和列表,Data.Proxy等

我想多做一件這樣的事情:如果fHasParser的實例,f的列表也是HasParser的實例。或者在Haskell中,那就是

instance (HasParser f) => HasParser [f] where 
    getParser = many' (getParser @f) 

好吧,這不會編譯。我收到以下錯誤消息:

error: Not in scope: type variable ‘f’

我不熟悉這些語言擴展的語法。特別是,使用@Proxy總是讓我困惑不已。希望有人能告訴我在哪裏可以找到最好的文檔。

+0

你意識到這是一個[類型的應用程序(https://ghc.haskell.org/trac/ghc/wiki/TypeApplication)(其沒有按在GHC-8.0之前根本沒有工作)? – leftaroundabout

+0

是的,我知道這一點。我正在使用ghc 8.0.2來編譯代碼。 – user2812201

回答

2

爲此需要ScopedTypeVariables

{-# LANGUAGE ScoperTypeVariables, UnicodeSyntax #-} 

instance ∀ f . HasParser f => HasParser [f] where 
    getParser = many' (getParser @f) 

(ASCII語法instance forall f . HasParser ...也有效。)

+1

這很有趣。與'forall f。 '代碼未能編譯。但我的代碼編譯爲打開'ScopedTypeVariables'語言擴展。 – user2812201

+0

好了!代碼編譯只要沒有'數據'有'字符串'字段。否則,編譯器會抱怨「HasParser重疊實例[Char]」。這讓我感到困惑,因爲我沒有'Char'作爲'HasParser'的實例。請參閱https://pastebin.com/FYrQHa5w上的代碼。代碼工作正常,沒有'String'部分。 – user2812201

+0

@ user2812201我相信重疊問題是由'HasParser String'實例引起的。在Haskell中,字符串實際上是字符列表。是否可以切換到像「文本」這樣的東西?如果沒有,也許像一個OVERLAPPABLE雜注可以工作http://stackoverflow.com/questions/39215103/ghc-overlapping-instances-when-generalising-addition – danidiaz