将可能值转换为正常值

Converting A Maybe Value Into A Normal Value

我不知道如何将 Maybe 值转换为正常值...

我有这些台词...

pickChord : Model -> Note -> Chord
pickChord model note =
    let
        nextChord = List.head (List.filter (testChord note) model.possibleMajorChords)
    in
        nextChord

编译器抱怨:

The definition of pickChord does not match its type annotation. - The type annotation for pickChord says it always returns:

Chord

But the returned value (shown above) is a:

Maybe Chord

我该如何处理这个问题?

谢谢。

如果你有一个 Maybe 线的列表,你想打开它然后:

pickChord : Model -> Note -> Chord
pickChord model note =
    let
        nextChord = List.head (List.filter (testChord note) model.possibleMajorChords)
    in

    case nextChord of                  
      Nothing ->                              
      //some error here if you want

      Just cord ->                             
        cord

因为 List.head 在空列表的情况下不会给你一个元素,你要么必须提供一个默认值

pickChord : Model -> Note -> Chord
pickChord model note =
    withDefault <chord> (List.head (List.filter (testChord note) model.possibleMajorChords))

或者保留默认的Chord给调用者。

pickChord : Model -> Note -> Maybe Chord
pickChord model note =
    List.head (List.filter (testChord note) model.possibleMajorChords)

这就是我喜欢 Elm 的原因。 Elm 以它自己的方式告诉您存在设计缺陷。

让我们仔细看看。这是原样的代码:

pickChord : Model -> Note -> Chord
pickChord model note =
    let
        nextChord = List.head (List.filter (testChord note) model.possibleMajorChords)
    in
        nextChord

所以你有一个大和弦列表,然后你可以过滤一个特定的音符。这会产生 List 个和弦。但是,List 类型可以表示一个空列表,这就是为什么 List.head return 是 Maybe 的原因。在您的情况下,List.head 可以 return NothingJust Chord

现在,您可以使用默认值和错误处理来解决这个问题,但这些只是避开真正问题的变通方法:列表类型不准确地适合您的问题领域。

如果你有一个 所有 大和弦的列表,我想不出为什么在应用过滤器后你会得到一个空列表.过滤器应该总是找到至少一个和弦。假设是这种情况,您需要的是一个类似于 List 的类型,它可以表示一个 never 为空的列表;这意味着 head 总是 return 一个 Chord 而不是 Maybe Chord。这将更好地代表您要实现的目标。幸运的是,已经有这样一种类型(我没有创建但我广泛使用)称为 List.Nonempty。它的工作原理如下:

import List.Nonempty as NE

pickChord : Model -> Note -> Chord
pickChord model note =        
    NE.head (NE.filter (testChord note) model.possibleMajorChords)

您的 model.possibleMajorChords 必须从 List Chord 更改为 List.Nonempty Chord,但这会使整个 可能存在的问题 消失。这当然是假设我关于过滤器的说法总是 return 至少有一个和弦成立。

这是 Nonempty 包的 link:http://package.elm-lang.org/packages/mgold/elm-nonempty-list/latest