1

次のコードは、押されるとボックス (およびそのボックスを削除するボタン) を作成するボタンを生成することになっています。

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

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

add = Signal.channel (0,0,0)
remove = Signal.channel (0)

button_add x y = Graphics.Input.button (Signal.send add (x, y, 2)) "add a box"

button_remove id = Graphics.Input.button (Signal.send remove (id)) "remove me"

main =
  let update event =
    case event of
      Add (x, y, id)  ->  Dict.insert id ((x,y), ((makebox id)))
      Remove (id)     ->  Dict.remove id
      Maybe          ->  identity
  in Signal.map (\dict ->  flow down
                            [ button_add 10.0 20.0 --makes add & remove buttons
                            , collage 500 500 (List.map (\(Just ((x,y), makebox)) -> move (x,y) makebox)
                                                (Dict.values dict)) --draws the dict
                            ]) --map function argument
  (foldp update Dict.empty
    (merge
      (Add    <~ (Signal.subscribe add)) --pipes button channels into events
      (Remove <~ (Signal.subscribe remove)))) --map signal argument

ただし、次のタイプのエラーが発生します。

Type mismatch between the following types on line 40, column 14 to 20:

   ((Int, Int))

   Maybe.Maybe

It is related to the following expression:

   update

このエラーがどこから来ているのか、Maybe.Maybe が に渡されている場所がupdateわかりません。どうすれば修正できますか?

4

1 に答える 1

1

TL;DR

collageこれへの呼び出しで行を見つけて置き換えますmain

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

クイックコードクリーンアップ

それはたくさんのコードです。それがどのように機能するかを理解するために、スタイルを少し変更する必要がありました。私がしたことは、より多くの関数を最上位に移動し、それらに型注釈を付けることでした。button_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

あまり役に立たないタイプのエラーが引き続き発生します。しかし、今はmove'機能しています。コメントで考えた型シグネチャを追加しました。

問題点)

このコードには 2 つの問題があります。

  1. move'Element(とりわけ) を取り、moveそれを試みますが、s でmove動作しFormます。toFormそのため、機能する前にへの呼び出しが必要です。
  2. これが型エラーの原因です: ( type の) 値Dict.valuesのリストではなく、値のリストを返します。JustMaybe.Maybe

したがって、解決策は次のmove'ような関数です。

move' : ((Float,Float), Element) -> Form
move' (a,b) = move a (toForm b)
于 2015-02-06T13:16:09.173 に答える