Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 榆树的神秘类型错配_User Interface_Dictionary_Types_Elm - Fatal编程技术网

User interface 榆树的神秘类型错配

User interface 榆树的神秘类型错配,user-interface,dictionary,types,elm,User Interface,Dictionary,Types,Elm,下面的代码应该生成一个按钮,按下该按钮时会创建一个框(以及一个用于移除框的按钮) 我不知道这个错误是从哪里来的,可能是从哪里来的。可能被传递到update,我如何修复它?TL;博士 用拼贴调用main查找并替换该行,以执行以下操作: , collage 500 500 (List.map (\((x,y), makebox) -> move (x,y) (toForm makebox)) 快速代码清理 这是很多代码。我不得不稍微改

下面的代码应该生成一个按钮,按下该按钮时会创建一个框(以及一个用于移除框的按钮)

我不知道这个错误是从哪里来的,可能是从哪里来的。可能被传递到
update
,我如何修复它?

TL;博士 用
拼贴
调用
main
查找并替换该行,以执行以下操作:

                            , collage 500 500 (List.map (\((x,y), makebox) -> move (x,y) (toForm makebox))

快速代码清理 这是很多代码。我不得不稍微改变一下风格来理解它是如何工作的。我所做的是将更多的函数移到顶层,并为它们提供类型注释。我还将
按钮\u add
/
remove
更改为camelCase,因为这是标准的Elm命名约定。结果是:

import Graphics.Input
import Signal (..)
import Signal
import Mouse
import Text (Text, asText, plainText)
import Graphics.Element (..)
import Graphics.Collage (..)
import Color (..)
import List
import Dict

--                  x    y   id   |         id
type Event = Add (Float, Float, Int) | Remove (Int) | Maybe

type alias Model = Dict.Dict Int ((Float,Float), Element)

makebox : Int -> Element
makebox id =
  let (w, h) = (30, 30)
  in flow down
    [ layers [plainText "aaaa", collage w h [square 30 |> filled red]]
    , buttonRemove id ]

add : Signal.Channel (Float,Float,Int)
add = Signal.channel (0,0,0)

remove : Signal.Channel Int
remove = Signal.channel 0

buttonAdd : Float -> Float -> Element
buttonAdd x y = Graphics.Input.button (Signal.send add (x, y, 2)) "add a box"

buttonRemove : Int -> Element
buttonRemove id = Graphics.Input.button (Signal.send remove id) "remove me"

update : Event -> Model -> Model
update event =
  case event of
    Add (x, y, id)  ->  Dict.insert id ((x,y), makebox id)
    Remove (id)     ->  Dict.remove id
    Maybe           ->  identity

-- move' : Just ((Float,Float),Element) -> Form
move' (Just ((x,y), makebox)) = move (x,y) makebox

view : Model -> Element
view dict = 
  flow down
    [ buttonAdd 10.0 20.0 --makes add & remove buttons
    , collage 500 500 (List.map move' (Dict.values dict)) --draws the dict
    ]

input : Signal Event
input = merge
  (Add    <~ (Signal.subscribe add)) --pipes button channels into events
  (Remove <~ (Signal.subscribe remove))

model : Signal Model
model = foldp update Dict.empty input

main : Signal Element
main = view <~ model

感谢您的清理和帮助,但这似乎并没有解决错误-只是将其移动到第49行和第52行之间。我不知道如何处理问题2。@user22723你确定吗?我检查两个TL;DR解决方案和发布前已清理的解决方案。请注意,上面清理的代码不是完全有效的代码,您需要将
move'
实现替换为我在回答结束时使用的实现。这里有一个编译版本:哦,我的错!我没有更换线路,哎呀。
                            , collage 500 500 (List.map (\((x,y), makebox) -> move (x,y) (toForm makebox))
import Graphics.Input
import Signal (..)
import Signal
import Mouse
import Text (Text, asText, plainText)
import Graphics.Element (..)
import Graphics.Collage (..)
import Color (..)
import List
import Dict

--                  x    y   id   |         id
type Event = Add (Float, Float, Int) | Remove (Int) | Maybe

type alias Model = Dict.Dict Int ((Float,Float), Element)

makebox : Int -> Element
makebox id =
  let (w, h) = (30, 30)
  in flow down
    [ layers [plainText "aaaa", collage w h [square 30 |> filled red]]
    , buttonRemove id ]

add : Signal.Channel (Float,Float,Int)
add = Signal.channel (0,0,0)

remove : Signal.Channel Int
remove = Signal.channel 0

buttonAdd : Float -> Float -> Element
buttonAdd x y = Graphics.Input.button (Signal.send add (x, y, 2)) "add a box"

buttonRemove : Int -> Element
buttonRemove id = Graphics.Input.button (Signal.send remove id) "remove me"

update : Event -> Model -> Model
update event =
  case event of
    Add (x, y, id)  ->  Dict.insert id ((x,y), makebox id)
    Remove (id)     ->  Dict.remove id
    Maybe           ->  identity

-- move' : Just ((Float,Float),Element) -> Form
move' (Just ((x,y), makebox)) = move (x,y) makebox

view : Model -> Element
view dict = 
  flow down
    [ buttonAdd 10.0 20.0 --makes add & remove buttons
    , collage 500 500 (List.map move' (Dict.values dict)) --draws the dict
    ]

input : Signal Event
input = merge
  (Add    <~ (Signal.subscribe add)) --pipes button channels into events
  (Remove <~ (Signal.subscribe remove))

model : Signal Model
model = foldp update Dict.empty input

main : Signal Element
main = view <~ model
move' : ((Float,Float), Element) -> Form
move' (a,b) = move a (toForm b)