операторы if-then с сигналами

Я застрял в написании простого оператора if-then в Elm с использованием сигналов.

Что, если условное выражение само имеет тип Signal? Я хотел бы изменить пример Mouse Down на веб-сайте Elm:

import Graphics.Element exposing (..)
import Mouse

main : Signal Element
main =
  Signal.map show Mouse.isDown

Будет указано True или False в зависимости от того, находится ли мышь вверху или внизу. Что, если я хочу, чтобы он говорил «Вверх» или «Вниз»? Моя логическая функция может сказать:

<!-- language: haskell -->

f : Bool -> String
f x = 
 if x then "&uarr;" else "&darr;"

но когда я меняю основную функцию, я получаю несоответствие типов.

<!-- language: haskell -->

main : Signal Element
main =
  Signal.map show ( f Mouse.isDown)

Ошибка №1:

The 2nd argument to function `map` has an unexpected type.

10|   Signal.map show ( f Mouse.isDown)
As I infer the type of values flowing through your program, I see a conflict
between these two types:

    Signal a

    String

Ошибка №2:

The 1st argument to function `f` has an unexpected type.

10|   Signal.map show ( f Mouse.isDown)
As I infer the type of values flowing through your program, I see a conflict
between these two types:

    Bool

    Signal Bool

person john mangual    schedule 13.09.2015    source источник


Ответы (1)


Это в основном то же самое, что и с show :: Bool -> Element. Вы не передаете Сигнал в эту функцию, а скорее map выполняете функцию поверх Сигнала. Это работает так же с вашим f:

import Mouse
import Graphics.Element exposing (Element, show)

f : Bool -> String
f x = if x then "&uarr;" else "&darr;"

updown : Signal String
updown = Signal.map f Mouse.isDown

main : Signal Element
main = Signal.map show updown

Или короче, с составом: main = Signal.map (show << f) Mouse.isDown.

person Bergi    schedule 13.09.2015