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)
您的
模型。可能的主和弦
必须从
列表和弦
更改为
列表非空和弦
,但这会使整个问题消失。这当然是假设我关于过滤器总是返回至少一个和弦的说法是正确的


这里有一个指向非空包的链接:

实际上。。。筛选器需要一个默认值。所以你可能需要一个不同的类型,但重点是列表可能不是它。实际上。。。筛选器需要一个默认值。因此,您可能需要不同的类型,但重点是列表可能不是它。