Tôi đang sử dụng phản ứng chuối trong giao diện WX. Tôi cần truy lục giá trị từ API dịch vụ bên ngoài khi nhấn nút.Banana phản ứng: cách sử dụng các giá trị từ một API từ xa và hợp nhất chúng trong luồng sự kiện
Tôi có chung Behavior
dựa trên loại dữ liệu AppState
rằng “tích lũy” các thay đổi được chuyển đổi dựa trên phép chuyển đổi chức năng (doSomeTransformation
). Các giá trị được chuyển đổi được vận chuyển bởi các sự kiện và chúng đến từ một API từ xa (getRemoteValue
) khi nhấn một nút trên giao diện. Tôi đã viết một phiên bản mỏng của mã đại diện cho phần thiết yếu:
module Main where
{-# LANGUAGE ScopedTypeVariables #-} -- allows "forall t. Moment t"
import Graphics.UI.WX hiding (Event)
import Reactive.Banana
import Reactive.Banana.WX
{-----------------------------------------------------------------------------
Main
------------------------------------------------------------------------------}
data AppState = AppState {
count :: Int
} deriving (Show)
type String = [Char]
main :: IO()
main = start $ do
f <- frame [text := "AppState"]
myButton <- button f [text := "Go"]
output <- staticText f []
set f [layout := margin 10 $
column 5 [widget myButton, widget output]]
let networkDescription :: forall t. Frameworks t => Moment t()
networkDescription = do
ebt <- event0 myButton command
remoteValueB <- fromPoll getRemoteApiValue
myRemoteValue <- changes remoteValueB
let
doSomeTransformation :: AppState -> AppState
doSomeTransformation ast = ast { count = count ast }
coreOfTheApp :: Behavior t AppState
coreOfTheApp = accumB initialState $ (doSomeTransformation to combine with myRemoteValue) <$ ebt
sink output [text :== show <$> coreOfTheApp]
network <- compile networkDescription
actuate network
getRemoteApiValue :: IO Int
getRemoteApiValue = return 5
và conf cabal:
name: brg
version: 0.1.0.0
synopsis: sample frp gui
-- description:
license: PublicDomain
license-file: LICENSE
author: me
maintainer: [email protected]
-- copyright:
category: fun
build-type: Simple
-- extra-source-files:
cabal-version: >=1.10
executable bgr
main-is: Main.hs
-- other-modules:
-- other-extensions:
build-depends: base >=4.7 && <4.8
, text
, wx ==0.92.0.0
, wxcore ==0.92.0.0
, transformers-base
, reactive-banana >=0.9 && <0.10
, reactive-banana-wx ==0.9.0.2
hs-source-dirs: src
default-language: Haskell2010
ghc-options: -Wall -O2
Vấn đề của tôi ở đây là làm thế nào để soạn doSomeTransformation
và myRemoteValue
trong một cách mà tôi có thể sử dụng giá trị API từ xa làm giá trị sự kiện bình thường. changes
từ chuối phản ứng có chữ ký sau đây:
changes :: Frameworks t => Behavior t a -> Moment t (Event t (Future a))
mà nó sẽ quấn tôi IO Int
từ getRemoteApiValue
.
Vì vậy, về cơ bản làm thế nào tôi có thể đi từ:
IO Int -> Moment t (Event t (Future AppState)) -> AppState
?
BTW Tôi không chắc liệu nó có sạch hơn không với chữ ký hàm khác này: doSomeTransformation :: Int -> AppState -> AppState
, trong đó giá trị Int
được biểu thị bằng giá trị trả về API. Có vẻ như hai số Behavior
s và một luồng. Có lẽ một cách xấu để giải quyết vấn đề?
làm thế nào về việc bạn đã cung cấp bản sao của sự cố? một dự án hoàn thành FP có lẽ, hoặc ít nhất là một mã nguồn đầy đủ. –
Một trong những điều tôi đang cố gắng hiểu về Haskell và fp nói chung là nếu nó đôi khi đủ cho các chữ ký hàm để mô tả vấn đề. Dù sao tôi sẽ cố gắng viết một cái gì đó trong fpcomplete. – Randomize
Đủ để mô tả vấn đề không giống như đủ để tái tạo và chơi với sự cố trong hộp cát. –