将可能值转换为正常值
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 Nothing
或 Just 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
我不知道如何将 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 forpickChord
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 Nothing
或 Just 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