我是Elm
的新手,可能对架构有不正确的理解,这可能是一个XY问题(但我还不知道......)
无论如何,我正在尝试在Elm中创建一个url-routed SPA。我使用evancz/start-app
生成单个动态页面,使用elm-achitecture-tutorial example 1作为每个“页面”的起点:
Frontend.Pages.Home.display : Signal Html
Frontend.Pages.Home.display = StartApp.start
{ model = 0
, update = update
, view = view
}
type alias Model = Int
type Action = Increment | Decrement
update : Action -> Model -> Model
update action model =
case action of
Increment -> model + 1
Decrement -> model - 1
view : Signal.Address Action -> Model -> Html
view address model =
div []
[ button [ onClick address Decrement ] [ text "-" ]
, div [ countStyle ] [ text (toString model) ]
, button [ onClick address Increment ] [ text "+" ]
]
我正在使用TheSeamau5/elm-router
route : String -> Signal Html
route = Router.match
[ "/" :-> Frontend.Pages.Home.display
] Frontend.Pages.Errors.FourOhFour.display
我正在使用TheSeamau5/elm-history
收集最新的网址:
main : Signal Html.Html
main = Frontend.Routes.route History.path
显然这是错误;我将Signal String
传递给一个带String
的方法。问题是,如果我使用以下内容:
main = Signal.map Frontend.Routes.route History.path
我希望Signal.map Frontend.Routes.route History.path
属于Signal Html
类型,而编译器会抱怨冲突:
The type annotation for `main` does not match its definition.
7| main : Signal Html.Html
^^^^^^^^^^^^^^^^ As I infer the type of values flowing through your program, I see a conflict between these two types:
Html.Html
Signal Html.Html
Signal Html
。是这种情况吗?无论如何,我的核心问题似乎是:如何呈现单页应用,根据Signal String
路由到单独的被动“网页”,而不重新实现{{1 }}吗
提前致谢。
答案 0 :(得分:1)
我相信你的最终结果是Signal (Signal Html)
,而主要期待Signal Html
。我相信您收到的错误是专门针对Signal a
期望的类型。它说,我期待a
为Html
,但实际上我发现它是Signal Html
。
以下是我们的类型:
Signal.map : (a -> result) -> Signal a -> Signal result
Frontend.Routes.route : String -> Signal Html
Historypath : Signal String
然后我们Signal.map Frontend.Routes.route
的类型为Signal String -> Signal (Signal Html)
。
然后我们应用History.path
向我们提供最终结果Signal (Signal Html)
如果您将route
更改为Html
而不是Signal Html
,那么您应该好好去。