将可能值转换为正常值

时间:2017-08-14 19:54:03

标签: elm

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

我有这些线......

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

编译器抱怨:

  

pickChord的定义与其类型注释不匹配。 - pickChord的类型注释表示它始终返回:

     

和弦

     

但是返回的值(如上所示)是:

     

也许Chord

我该如何处理这个问题?

感谢。

3 个答案:

答案 0 :(得分:2)

如果你有一个想要解开它的可能绳子列表,那么:

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

答案 1 :(得分:2)

这就是我爱榆树的原因。以它自己的方式,榆树告诉你你有一个设计缺陷。

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

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

因此,您有一个主要和弦列表,然后您可以过滤特定音符。这会产生List个和弦。但是,List类型可以表示空列表,这就是List.head返回Maybe的原因。在您的情况下,List.head可以返回NothingJust Chord

现在,可以使用默认值和错误处理来解决这个问题,但这些只是解决实际问题的解决办法: List类型不能准确地解决您的问题域。

如果您有一个所有主要和弦的列表,我想不出为什么在应用过滤器之后你最终会得到一个空列表。滤波器应始终至少找到一个和弦。假设是这种情况,你需要的是类似List的类型,它可以表示从不为空的列表;这意味着head始终会返回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,但这会导致整个问题消失。这当然是假设我对滤波器的声明总是至少返回一个和弦。

以下是Nonmpty包的链接:http://package.elm-lang.org/packages/mgold/elm-nonempty-list/latest

答案 2 :(得分:1)

由于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)