我不知道如何将Maybe值转换为正常值......
我有这些线......
pickChord : Model -> Note -> Chord
pickChord model note =
let
nextChord = List.head (List.filter (testChord note) model.possibleMajorChords)
in
nextChord
编译器抱怨:
pickChord
的定义与其类型注释不匹配。 -pickChord
的类型注释表示它始终返回:和弦
但是返回的值(如上所示)是:
也许Chord
我该如何处理这个问题?
感谢。
答案 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
可以返回Nothing
或Just 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)