私はHaxlライブラリを使用していると私が同時にfetchHTML
を実装しようとしています:多型Hax1ライブラリーでの単形関数の使用?
import Data.Aeson
import Control.Concurrent.Async
import Control.Concurrent.QSem
import Haxl.Core
import Haxl.Prelude
instance DataSource' u HTTPRequest where
fetch = metaImplementation
data HTTPRequest a where
MakeRequest :: HTTPRequest Int
instance StateKey HTTPRequest where --Link HTTPRequest to State class
data State HTTPRequest =
HTTPRequestState {threadNum :: Int}
initialiseState :: Int -> IO (State HTTPRequest)
initialiseState threads = do
return HTTPRequestState {threadNum = threads}
metaImplementation :: State HTTPRequest -> Flags -> u -> [BlockedFetch' HTTPRequest] -> PerformFetch
metaImplementation HTTPRequestState{..} _flags user bfs =
AsyncFetch $ \inner -> do
sem <- newQSem threadNum
asyncs <- mapM (implementation sem) bfs
inner
mapM_ wait asyncs
implementation :: QSem -> BlockedFetch' HTTPRequest -> IO(Async())
implementation sem (BlockedFetch' request returnVal) =
async $ bracket_ (waitQSem sem) (signalQSem sem) $ do
e <- Control.Exception.try $
fetchHTML
case e of
Left ex -> putFailure returnVal (ex :: SomeException)
Right el -> putSuccess returnVal el
fetchHTML :: IO Int
fetchHTML = do
res <- get "https://example.com"
let resBody = res ^. responseBody
return (200)
makeHTTPRequest :: GenHaxl u Int --Perform concurrent fetches
makeHTTPRequest = dataFetch (MakeRequest)
私が直面してる問題はHaxlのBlockedFetch
が多型であるということである。
BlockedFetch :: forall (r :: * -> *) a. r a -> ResultVar a -> BlockedFetch r
私はfetchHTML
を望みますmonomorphic(intのみを返す):
fetchHTML :: IO Int
fetchHTML = do
res <- get "https://www.bbc.com"
let resBody = res ^. responseBody
return (200)
私は次のようになる私がコンパイルしようとROR:
Couldn't match expected type ‘a’ with actual type ‘Int’
‘a’ is a rigid type variable bound by
a pattern with constructor:
BlockedFetch :: forall (r :: * -> *) a.
r a -> ResultVar a -> BlockedFetch r,
in an equation for ‘implementation’
は、当初私はので、私は再定義することができBlockedFetch
を考えた:
data BlockedFetch' a where --Custom monomorphic implementation of BlockedFetch
BlockedFetch' :: HTTPRequest Int -> ResultVar Int -> BlockedFetch' HTTPRequest
はしかし、それは私を受信することを可能にするために、DataSource
の新しい実装が必要ですカスタムBlockFetch'
:
class (DataSourceName r, StateKey r) => DataSource' u r where
fetch :: State r -> Flags -> u -> [BlockedFetch' r] -> PerformFetch
明らかに、これは単なる後方に影響し、再ために私を必要としますHaxlモジュール全体を書いてください!
私の質問は以下のとおりです。
1)fetchHTML
多型を作るための簡単な方法はありますか? (私はそれが何を返すのか心配していません。何かが完了したときにを返す)
2)この種の問題に直面したとき、ハスケルプログラマーの一般的なアプローチは何ですか?
私の編集は大丈夫ですか? –
@BabraCunninghamいいえ:MakeRequestコンストラクタ内のパラメータと一致するようにしたバージョンを書きました( 'BlockedFetch '(MakeRequest int)returnVal)' 'MakeRequest'は空のコンストラクタです –
I see!実装を 'implementation sem(BlockedFetch(MakeRequest)returnVal)=' 'に変更しました。"これはMakeRequestの "match"の意味ですか? –