1

我一直在努力让这些领域发挥作用,但一直失败。我也一直在尝试寻找示例,但我能找到的唯一示例是使用 Elm 0.14,它使用 Elm 0.13 中不可用的新 Channel API。

所以我从目录中提供的示例开始

import Graphics.Input.Field (..)
import Graphics.Input (..)

name : Input Content
name = input noContent

nameField : Signal Element
nameField = field defaultStyle name.handle identity "Name" <~ name.signal

为了使用我尝试过的领域

main : Signal Element
main = Signal.lift2 display Window.dimensions gameState

display : (Int,Int) -> GameState -> Element
display (w,h) g =
    container w h middle <|
        collage gameWidth gameHeight
            (if  | g.state == Menu ->
                    [ rect gameWidth gameHeight
                        |> filled black
                    , toForm nameField
                    , plainText "*The name entered in the nameField*"
                    ]
                | otherwise -> []
            )

但我不断收到以下错误

Expected Type: Signal.Signal Graphics.Element.Element
Actual Type: Graphics.Element.Element

为什么元素不再是信号了......函数定义明确指出它应该输出信号,对吗?现在我将如何输入一个名称,然后我就可以在变量中使用它了?

4

1 回答 1

1

Elm 0.13 有一些令人讨厌的令人困惑的类型错误消息。预期/实际通常交换。在这种情况下,问题来自使用nameField : Signal Elementin display : (Int,Int) -> GameState -> Elementdisplay是纯(非信号)函数,但要纯,您不能在其中的任何地方使用信号。为了解决这个问题,将nameField信号提升一个级别,到main. 要使用在字段中输入的内容,请使用输入信号:

main : Signal Element
main = Signal.lift4 display Window.dimensions gameState name.signal

nameField : Content -> Element
nameField = field defaultStyle name.handle identity "Name"

display : (Int,Int) -> GameState -> Content -> Element
display (w,h) g currentContent =
    container w h middle <|
        collage gameWidth gameHeight
            (if  | g.state == Menu ->
                    [ rect gameWidth gameHeight
                        |> filled black
                    , toForm (nameField currentContent) -- use something other than `currentContent` here to influence the field content. 
                    , plainText currentContent.string
                    ]
                | otherwise -> []
            )
于 2014-12-21T18:19:48.290 回答