Syntax 为什么在这个Elm代码中case表达式不起作用?

Syntax 为什么在这个Elm代码中case表达式不起作用?,syntax,pattern-matching,elm,Syntax,Pattern Matching,Elm,我编写了一个Elm代码片段,每次单击鼠标时,它都会绘制一个正方形,并在红色和黑色之间更改正方形的颜色 但是,changeColor函数中的case结构不能按预期工作,而使用if结构实现的changeColor可以工作 我应该怎么做才能找出哪里出了问题?多谢各位 import Color exposing (red, black, blue, Color) import Signal exposing ((<~)) import Graphics.Element exposing (Elem

我编写了一个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
简单的答案是模式变量 大小写模式中的小写名称始终被视为变量,而不是常量。因此,您的case语句将根据模式变量black匹配color,这将成功,并将名称black绑定到case分支->red中的color值

在这种情况下,注释中的multi-way if是区分这些情况的适当方法

用例表达式 大小写表达式用于区分中的大小写。例如,您可以使用联合类型显式地为您的程序状态建模,如下所示:

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
这样做的原因可能是您现在在一个容易找到的地方为您的程序提供了一个有限的、可枚举的状态。如果你只使用颜色,你只能通过查看整个程序来确定这一点。case表达式是详尽的,它处理程序可能处于的所有状态。然而,如果使用多向if on颜色,谁知道这些颜色是否是您的程序中可能拥有的唯一颜色,尤其是当它超过玩具示例大小时。如果您没有匹配所有可能的颜色,您的应用程序可能会在运行时崩溃。这是在Elm模式变量中可能发生的少数几种方法之一 大小写模式中的小写名称始终被视为变量,而不是常量。因此,您的case语句将根据模式变量black匹配color,这将成功,并将名称black绑定到case分支->red中的color值

在这种情况下,注释中的multi-way if是区分这些情况的适当方法

用例表达式 大小写表达式用于区分中的大小写。例如,您可以使用联合类型显式地为您的程序状态建模,如下所示:

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
这样做的原因可能是您现在在一个容易找到的地方为您的程序提供了一个有限的、可枚举的状态。如果你只使用颜色,你只能通过查看整个程序来确定这一点。case表达式是详尽的,它处理程序可能处于的所有状态。然而,如果使用多向if on颜色,谁知道这些颜色是否是您的程序中可能拥有的唯一颜色,尤其是当它超过玩具示例大小时。如果您没有匹配所有可能的颜色,您的应用程序可能会在运行时崩溃。这是Elm中可能发生的少数几种方法之一