私は History.js から PureScript へのバインディングを書いていますが、Eff モナド、エフェクトの行とは何か、なぜそれらが価値があるのかを理解するのにまだ苦労しています。今、私は次のように書かれていますEasyFFI
type Title = String
type Url = String
type State = forall a. {title :: Title, url :: Url | a}
type Data = forall a. { | a}
type StateUpdater = Data -> Title -> Url -> Unit
-- this function is a work around for 'data' as a reserved word.
foreign import getData
"function getData(state){ return state['data']; }"
:: forall a b. { | a} -> b
unwrapState :: StateUpdater -> State -> Unit
unwrapState f s = f (getData s) s.title s.url
replaceState' :: StateUpdater
replaceState' = unsafeForeignProcedure ["data","title","url"] "History.replaceState(data,title,url)"
replaceState :: State -> Unit
replaceState = unwrapState replaceState'
foreign import data BeforeEach :: !
beforeEach :: forall e a. Eff e a -> Eff (beforeEach :: BeforeEach | e) Unit
beforeEach = unsafeForeignProcedure ["fn",""] "window.beforeEach(fn);"
コードの後半には、次のものがあります。
beforeEach $ do
replaceState {title = "wowzers!", url = "/foos"}
次のエラーが表示されます
Cannot unify Prelude.Unit with Control.Monad.Eff.Eff u2518 u2517.
さまざまな方法で型シグネチャを操作してすべてを揃えようとしましたが、何が問題なのかよくわかりません。したがって、この時点で推測するだけです。