Сигнал (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