Несоответствие типа списка Elm

Я следовал (старому?) руководству и обнаружил несоответствие типов. Изменилась ли библиотека List с 0.14.1 на 0.15? страница elm.

Код:

module Fibonacci where

import List exposing (..)

fibonacci : Int -> List Int
fibonacci n =
   let fibonacci1 n acc =
           if n <= 2
               then acc
               else fibonacci1 (n-1) ((head acc + (tail >> head) acc) :: acc)
   in
       fibonacci1 n [1,1] |> reverse 

Несоответствие типов:

Type mismatch between the following types on line 11, column 40 to 69:

        number

        Maybe.Maybe a

    It is related to the following expression:

        (head acc) + ((tail >> head) acc)

Type mismatch between the following types on line 11, column 52 to 64:

        Maybe.Maybe

        List

    It is related to the following expression:

        tail >> head

person ampc    schedule 10.05.2015    source источник


Ответы (1)


Да, я боюсь, что оба эти материала старые (чем 0.15). Elm 0.15 использует ядро ​​2.0.1, в котором (как следует из версии) есть критические изменения.
Вы столкнулись с тем, что head и tail теперь возвращают Nothing вместо сбоя на пустых списках. Когда список не пуст, вы получаете голову/хвост, завернутые в Just. Эти два конструктора относятся к типу Maybe.

Вот некоторый обновленный код (который не нуждается в голове/хвосте):

fibonacci : Int -> List Int
fibonacci goal =
    let fibonacciHelp n a b fibs =
        if n >= goal
            then List.reverse fibs
            else fibonacciHelp (n+1) (a + b) a (a :: fibs)
    in
        fibonacciHelp 0 1 0 []

Источники:

person Apanatshka    schedule 10.05.2015