use*_*687 1 syntax pattern-matching elm
我编写了一个 Elm 代码片段,它会绘制一个正方形,并在每次单击鼠标时在红色和黑色之间更改正方形颜色。
然而,changeColor函数中的case结构不能按预期工作,而使用if结构实现的changeColor可以工作。
我应该怎么做才能找出问题所在?谢谢。
import Color exposing (red, black, blue, Color)
import Signal exposing ((<~))
import Graphics.Element exposing (Element, show)
import Graphics.Collage exposing (collage, square, filled, Form)
import Mouse
import Window
main : Signal Element
main =
scene <~ (Signal.foldp changeColor black Mouse.clicks)
scene : Color -> Element
scene color =
collage 600 600 [ filled_square color ]
changeColor : () -> Color -> Color
changeColor _ color =
case color of
black -> red
red -> black
--changeColor _ color =
-- if | color == black -> red
-- | color == red -> black
filled_square : Color -> Form
filled_square color = square 100 |> filled color
Run Code Online (Sandbox Code Playgroud)
大小写模式中的小写名称始终被视为变量,而不是常量。因此,您的 case 语句将根据模式变量 匹配颜色black,这会成功,并将名称绑定到case 分支 ( ) 内部black的值。color-> red
if在这种情况下,注释中的多种方式是区分情况的适当方法。
Case 表达式用于区分联合类型中的情况。例如,您可以使用联合类型显式地对程序状态进行建模,如下所示:
import Color exposing (red, black, blue, Color)
import Signal exposing ((<~))
import Graphics.Element exposing (Element, show)
import Graphics.Collage exposing (collage, square, filled, Form)
import Mouse
import Window
type Model = Red | Black
main : Signal Element
main =
scene <~ (Signal.foldp changeColor Black Mouse.clicks)
scene : Model -> Element
scene model =
collage 600 600 [ filled_square (toColor model) ]
toColor : Model -> Color
toColor model =
case model of
Black -> black
Red -> red
changeColor : () -> Model -> Model
changeColor _ model =
case model of
Black -> Red
Red -> Black
filled_square : Color -> Form
filled_square color = square 100 |> filled color
Run Code Online (Sandbox Code Playgroud)
这样做的原因可能是你的程序现在在一个容易找到的地方有一个有限的、可枚举的状态。如果您只使用颜色,您只有通过查看整个程序才能确定这一点。case 表达式是详尽的,它处理程序可能处于的所有状态。而对于颜色的多路 if,谁知道这些是否是程序中可能具有的唯一颜色,尤其是当它变得比玩具示例更大时-尺寸。如果您不匹配所有可能的颜色,您的应用程序可能会遇到运行时崩溃。(这是 Elm 中可能发生的少数几种可能的方式之一)