我工作的圖書館查詢Google Maps Web Services之間的映射。如何創建類型
我有一個類型類
class GoogleMapsRequest a
限定構建URL和一個功能
queryAPI :: (FromJSON x, GoogleMapsRequest r) => r -> GoogleMaps x
需要一些功能(GoogleMaps
是一個簡單的MonadStack得到一些配置值等)。現在我只需要爲每個Web服務定義一些數據類型和實例。例如,我創建的地理編碼服務:
data GeocodeRequest = GeocodeAddress Text
data GeocodeResponse = ...
instance GoogleMapsRequest GeocodeRequest where
...
geocode :: GeocodeRequest -> GoogleMaps GeocodeResponse
geocode = queryAPI
我在這裏的問題是,我需要包裝queryAPI
或指定響應類型明確,雖然響應類型基本上是清楚的,我可以做的東西,如:
geocode :: GeocodeRequest -> GoogleMaps Text
,編譯,但總是失敗。
所以在這裏我的問題是:是否有任何很酷的功能或者也許這我沒有看到獲得請求和響應類型之間的這種映射一個顯而易見的解決方案?
我試圖讓一個MultiParamTypeClass
:
class GoogleMapsRequest a b
queryAPI :: (FromJSON x, GoogleMapsRequest r x) => r -> GoogleMaps x
,但我不知道這是正確的做法,我總是得到一些「無法演繹出」錯誤形成使用該功能來構建網址。
謝謝!
雖然不完全是一個答案,我的建議是不要如果他們無法遵守任何財產或法律,請使用類似「GoogleMapsRequest」或「GoogleMaps」的類。看看你的例子,似乎只是定義一些類型並在其上運行一些功能應該可以解決你的問題。 – Sibi 2014-10-03 20:46:47
'class GoogleMapsRequest a b'不允許編譯器從輸入類型推導出結果類型。您可能想要啓用函數依賴關係,並且需要'class GoogleMapsRequest a b | a - > b' – user2407038 2014-10-04 00:46:47
儘管@Sibi提到的並不是真正需要的類型類,但是在使用多參數類型類時,函數依賴關係並沒有做到這一點。謝謝! – 2014-10-04 08:40:09