首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试提升Aff响应时出现无类型类实例错误

尝试提升Aff响应时出现无类型类实例错误
EN

Stack Overflow用户
提问于 2020-10-18 06:34:48
回答 1查看 45关注 0票数 0

我是Purescript的新手,正在尝试学习卤素/Aff。我一直在开发一个简单的应用程序,它是purescript-halogen repo中的effects-aff-ajax示例的变体。除了下面的错误之外,我几乎所有的工作都正常了。

出现错误的代码部分与effects-aff-ajax示例中的代码非常相似(我还没有编译它,但我只能假设它可以工作)。检查代码后,我发现它没有理由不能提升Aff响应。

代码语言:javascript
复制
Error found:
in module Component
at src/purs/Component.purs:59:17 - 59:26 (line 59, column 17 - line 59, column 26)

  No type class instance was found for
                                
    Effect.Aff.Class.MonadAff m2
                                

while checking that type forall m. MonadAff m => (forall a. Aff a -> m a)
  is at least as general as type t0 -> t1
while checking that expression liftAff
  has type t0 -> t1
in value declaration handleAction

where m2 is a rigid type variable
        bound at (line 54, column 16 - line 60, column 60)
      t1 is an unknown type
      t0 is an unknown type

下面是完整的模块:

代码语言:javascript
复制
module Component (component) where

import Prelude (Unit, bind, discard, map, ($), (<<<), (<>))

import Affjax as AX
import Affjax.RequestBody as AXRB
import Affjax.ResponseFormat as AXRF
import Data.Either (hush)
import Data.Maybe (Maybe(..))
import Effect.Class (class MonadEffect)
import Halogen as H
import Halogen.HTML as HH
import Halogen.HTML.Events as HE
import Halogen.HTML.Properties as HP
import Web.Event.Event as E

type State = { source :: String, translation :: Maybe String }

data Action = InputSource String 
  | TranslateSource State E.Event

component :: ∀ f i o m. MonadEffect m => H.Component HH.HTML f i o m
component =
  H.mkComponent
    { initialState
    , render
    , eval: H.mkEval $ H.defaultEval { handleAction = handleAction }
    }

initialState :: ∀ i. i -> State
initialState _ = { source: "that wine is very delicious", translation: Nothing }

render :: ∀ m. State -> H.ComponentHTML Action () m
render state =
  HH.form
    [ HE.onSubmit (Just <<< TranslateSource state) ]
    [ HH.h1_ [ HH.text "English to Italian Translation" ]
    , HH.input
        [ HP.type_ HP.InputText
        , HP.value state.source
        , HE.onValueInput $ Just <<< InputSource
        ]
    , HH.p_ []
    , HH.button
        [ HP.type_ HP.ButtonSubmit ]
        [ HH.text "Translate" ]
    , HH.p_ [ HH.text $ case state.translation of
                          Nothing -> ""
                          Just t -> "Translation: " <> t 
            ]         
    ]

handleAction :: ∀ o m. MonadEffect m => Action -> H.HalogenM State Action () o m Unit
handleAction = case _ of
  InputSource s -> 
    H.modify_ _{ source = s }
  TranslateSource st ev -> do
    H.liftEffect $ E.preventDefault ev
    response <- H.liftAff $ AX.post AXRF.string "http://locahost:8080/translate" (Just $ AXRB.string st.source)
    H.modify_ _{ translation = map _.body (hush response) }
EN

回答 1

Stack Overflow用户

发布于 2020-10-19 03:04:21

是的,就是费奥多·索金。我需要让组件使用MonadAff而不是MonanEffect。谢谢!

代码语言:javascript
复制
component :: ∀ f i o m. MonadAff m => H.Component HH.HTML f i o m
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64408000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档