Search code examples
typeerrorelmoption-type

error in elm-lang `(==) is expecting the right side to be a:`


New to elm here, and at first it's driving me absolutely crazy not knowing the ins and outs of this picky language (even after reading a sh**load about it because it's just so different and finicky... I guess that's the nature of a functional lang) so when you try doing a simple thing it's like pulling hair at first.

I am getting the following error:

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

fine, I assume it is correct and check the right side. So the problem may be in how the left and right arguments interact. Test:

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

Now I'm assuming but not sure, that it's getting Nothing or something when trying to pull the first value out of my array but not sure. Maybe Char I assume is returning Nothing? donno, probably have other issues going on with it too.

I'd like to get the code above working, then refactor..I'm sure there's probably a more elegant way to code what I've coded above but first thing's first, fixing this error and understanding it better with the existing code. The error message while nice isn't that obvious to me as to how and what to handle. I have assumptions but not fully sure how to handle the behavior here of whatever is causing the issue.


Solution

  • Unique feature of the elm is certainty. Any variable (which is not of type maybe) will have a value of the defined type for sure.

    But when it comes to array or list, it becomes uncertain if the array has an element on index "i". There may be an element and there may not be.

    Hence elm has concept of Maybe, so conceptually

    Maybe String = [ Just "string_value" | Nothing ] 
    

    the alias for the Array.get is

    get : Int -> Array a -> Maybe a
    

    it takes Int - index and Array a - array of data type of array element as parameters and returns Maybe a - again a is the data type of array element

    consider an example

    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
    

    this way you will always have to handle both the situations, when you have a value and when you don't

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

    and if you always need a default value, you can use

    Maybe.withDefault "default_string" val1
    

    this will always return a string value and will return "default_string" when the value is nothing otherwise the actual found value