Сигнал (Int, Int) не распознается как (Int, Int) кортеж в некоторых случаях

В зависимости от типа возврата, Сигнал (Int, Int) не распознается как кортеж (Int, Int).

Рассмотрим следующий код:

import Graphics.Element exposing (..)
import Mouse


relativeMouseElement : (Int, Int) -> Element
relativeMouseElement mp = show (fst mp - 1000, snd mp - 1000)


relativeMouseTuple : (Int, Int) -> (Int, Int)
relativeMouseTuple mp = (fst mp - 1000, snd mp - 1000)

main =
--  Signal.map relativeMouse Mouse.position
    relativeMouseTuple Mouse.position

Signal.map relativeMouse Mouse.position работает просто отлично, отображает (-1000, -1000) в браузере и значения корректируются в соответствии с движением мыши.

relativeMouseTuple Mouse.position Это, хотя и не работает. Я получаю следующую сложную ошибку:

Function `relativeMouseTuple` is expecting the argument to be:

    ( Int, Int )

But it is:

    Signal ( Int, Int )

Я нахожу это очень странным. В обоих случаях первым аргументом является Signal (Int, Int), а во втором случае это приводит к ошибке типа.

Есть идеи?

1 ответ

Решение

У меня нет опыта работы с вязом ВСЕ, однако:

Signal.map отображает функцию на сигнал, это не означает, что функция вызывается с Signal в качестве параметра, но он вызывается с аргументами сигнала в качестве параметра. например для Signal(Int, Int) вы отображаете функцию, которая получает (Int, Int) в качестве аргументов.

Так что в следующем случае у вас нет проблем

Signal.map relativeMouse Mouse.position

Однако в приведенном ниже случае вы вызываете функцию, которая ожидает (Int, Int) с аргументом Signal(Int, Int) что не так

relativeMouseTuple Mouse.position

Что вы должны сделать, это, вероятно, сопоставить вашу функцию с сигналом следующим образом:

Signal.map relativeMouseTuple Mouse.position
Другие вопросы по тегам