2017-08-14 59 views
0

我不知道如何将一个也许值转换成正常值......转换也许值转换为正常价值

我有这些行...

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

编译器会抱怨:

pickChord的定义与其类型注释不匹配。 - 对于pickChord类型标注说,它总是返回:

和弦

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

也许和弦

我怎么能处理这个问题?

谢谢。

回答

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类似的类型,它可以代表一个列表,它是从不空;这意味着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,但它使整个也许问题消失。当然,假设我对过滤器总是返回至少一个和弦的说法是成立的。

下面是对非空包的链接:http://package.elm-lang.org/packages/mgold/elm-nonempty-list/latest

+0

其实...过滤器需要一个默认值。所以你可能需要一个不同的类型,但重点是List可能不是它。 –

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

因为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)