ошибка в elm-lang `(==) ожидает, что правая сторона будет:` - PullRequest
0 голосов
/ 23 октября 2018

Новый для вяза здесь, и поначалу он сводит меня с ума, не зная тонкостей этого придирчивого языка (даже после прочтения sh ** нагрузки об этом, потому что он такой разный и привередливый ...природа функционального языка) поэтому, когда вы пытаетесь сделать простую вещь, это как сначала дергать волосы.

Я получаю следующую ошибку:

The right side of (==) is causing a type mismatch.

29|             get 0 arrayOfValues == 'X'
                              ^^^
(==) is expecting the right side to be a:

    Maybe Char

But the right side is:

    Char

Hint: With operators like (==) I always check the left side first. If it seems

хорошо, я предполагаю, что этоисправить и проверить правильную сторону.Таким образом, проблема может заключаться в том, как взаимодействуют левый и правый аргументы.Тест:

it "blah blah blah" <|
    let
        someArray =
            [ 'P', ' ' ]
    in
expect (MyModule.doSomething someArray 'P') to equal 1
MyModule

doSomething : List Char -> Char -> Int
doSomething arrayOfValues symbol =
    let
        grid =
            fromList arrayOfValues

        found =
            get 0 arrayOfValues == symbol
    in
    if found then
        1
    else
        0

Теперь я предполагаю, но не уверен, что он получает ничего или что-то при попытке извлечь первое значение из моего массива, но не уверен.Может Чар, я полагаю, ничего не возвращает?Донно, возможно, у меня тоже возникают другие проблемы.

Я бы хотел, чтобы код выше работал, а затем рефакторинг ... Я уверен, что, вероятно, есть более элегантный способ кодирования того, что я кодировалвыше, но первым делом, исправление этой ошибки и лучшее понимание ее с помощью существующего кода.Сообщение об ошибке, хотя приятно, не так очевидно для меня, как и что обрабатывать.У меня есть предположения, но я не совсем уверен, как справиться с поведением здесь того, что вызывает проблему.

1 Ответ

0 голосов
/ 23 октября 2018

Уникальной особенностью вяза является уверенность.Любая переменная (которая может быть не типа) наверняка будет иметь значение определенного типа.

Но когда дело доходит до массива или списка, становится неопределенным, если массив имеет элемент по индексу "i",Может быть элемент, а может и не быть.

Следовательно, у elm есть концепция Maybe, поэтому концептуально

Maybe String = [ Just "string_value" | Nothing ] 

псевдоним для Array.get -

get : Int -> Array a -> Maybe a

принимает Int - индекс и Array a - массив типа данных элемента массива в качестве параметров и возвращает Maybe a - снова a является типом данных элемента массива

рассмотрим пример

array = 
   fromList ["one", "two"]


  val1 = 
    get 0 array -- will return 'Just "one"'

  val2 = 
    get 3 array -- will return 'Nothing', since the element does not exists

таким образом, вам всегда придется обрабатывать обе ситуации, когда у вас есть значение, а когда нет

case val1 of
  Nothing -> 
    -- Raise some error message
  Just val ->
    -- `val` is the actual element/value found

и если вам всегда нужно значение по умолчанию, вы можете использовать

Maybe.withDefault "default_string" val1

это всегда будет возвращать строковое значение и будет возвращать "default_string", когда значение ничто, в противном случае фактическое найденное значение

...