Elm 将可能值转换为正常值
我不知道如何将一个可能值转换为正常值 我有这些台词Elm 将可能值转换为正常值,elm,Elm,我不知道如何将一个可能值转换为正常值 我有这些台词 pickChord : Model -> Note -> Chord pickChord model note = let nextChord = List.head (List.filter (testChord note) model.possibleMajorChords) in nextChord 编译器抱怨: pickChord的定义与其类型注释不匹配。-pickChord
pickChord : Model -> Note -> Chord
pickChord model note =
let
nextChord = List.head (List.filter (testChord note) model.possibleMajorChords)
in
nextChord
编译器抱怨:
pickChord
的定义与其类型注释不匹配。-pickChord
的类型注释表示它总是返回:
和弦
但返回值(如上所示)是:
也许是和弦
我如何处理这个问题
谢谢。如果您有要拆开的线缆列表,请:
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
如果您有要展开的线缆列表,则:
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))
因为在空列表的情况下,
List.head
不会给您一个元素,所以您必须提供一个默认值
pickChord : Model -> Note -> Chord
pickChord model note =
withDefault <chord> (List.head (List.filter (testChord note) model.possibleMajorChords))
这就是我爱榆树的原因。Elm以自己的方式告诉你,你有一个设计缺陷 让我们仔细看看。代码如下:
pickChord : Model -> Note -> Chord
pickChord model note =
let
nextChord = List.head (List.filter (testChord note) model.possibleMajorChords)
in
nextChord
因此,你有一个主要和弦的列表,然后你过滤一个特定的音符。这将生成和弦的列表。但是,List
类型可以表示一个空列表,这就是为什么List.head
返回一个Maybe
。在您的情况下,List.head
可以返回Nothing
或Just Chord
现在,您可以使用默认值和错误处理来解决这个问题,但这些只是回避实际问题的解决办法:列表类型不适合您的问题域。
如果你有一个所有主要和弦的列表,我想不出为什么你在应用过滤器后会得到一个空列表。过滤器应始终至少找到一个和弦。假设是这样,您需要的是一个类似于列表的类型,它可以表示一个从不为空的列表;这意味着head
将始终返回和弦
,而不是和弦
。这将是一个更好的表达你正在努力实现的目标。幸运的是,已经有了这样一种类型(我没有创建,但我广泛使用),叫做List.Nonempty
。下面是它的工作原理:
import List.Nonempty as NE
pickChord : Model -> Note -> Chord
pickChord model note =
NE.head (NE.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.head
返回一个Maybe
。在您的情况下,List.head
可以返回Nothing
或Just Chord
现在,您可以使用默认值和错误处理来解决这个问题,但这些只是回避实际问题的解决办法:列表类型不适合您的问题域。
如果你有一个所有主要和弦的列表,我想不出为什么你在应用过滤器后会得到一个空列表。过滤器应始终至少找到一个和弦。假设是这样,您需要的是一个类似于列表的类型,它可以表示一个从不为空的列表;这意味着head
将始终返回和弦
,而不是和弦
。这将是一个更好的表达你正在努力实现的目标。幸运的是,已经有了这样一种类型(我没有创建,但我广泛使用),叫做List.Nonempty
。下面是它的工作原理:
import List.Nonempty as NE
pickChord : Model -> Note -> Chord
pickChord model note =
NE.head (NE.filter (testChord note) model.possibleMajorChords)
您的模型。可能的主和弦
必须从列表和弦
更改为列表非空和弦
,但这会使整个问题消失。这当然是假设我关于过滤器总是返回至少一个和弦的说法是正确的
这里有一个指向非空包的链接:实际上。。。筛选器需要一个默认值。所以你可能需要一个不同的类型,但重点是列表可能不是它。实际上。。。筛选器需要一个默认值。因此,您可能需要不同的类型,但重点是列表可能不是它。