Haskell中的非穷举模式

时间:2017-05-22 17:31:19

标签: haskell

我对Haskell很新,所以请理解我的问题有点愚蠢。实际上感觉就像。

所以我现在试着解决这个问题几个小时.. 我有这个

data Slot = Slot {
            getTime :: Time,
            getSubject :: Name
            }
deriving(Show,Eq)

 slotListToSlot :: [Slot] -> Slot
 slotListToSlot [] = ???
 slotListToSlot (x:xs) = x

编译器抱怨空插槽列表没有模式。 当然,问号只是为了显示缺少代码的位置。

此时我真的不知道该怎么做。 欢迎任何想法和帮助^^

3 个答案:

答案 0 :(得分:5)

您有三种选择:

  1. 使用ng-repeat

    Maybe

    替代实现:在标准Data.Maybe包中使用listToMaybe

    slotListToSlot :: [Slot] -> Maybe Slot
    slotListToSlot [] = Nothing
    slotListToSlot (x:xs) = Just x
    
  2. 使用Data.List.NonEmpty

    slotListToSlot :: [Slot] -> Maybe Slot
    slotListToSlot = listToMaybe
    
  3. 使用import Data.List.NonEmpty slotListToSlot :: NonEmpty Slot -> Slot slotListToSlot = neHead

    error
  4. 我建议使用第一个选项,因为2.是不切实际的,除非你在程序中的任何地方使用slotListToSlot :: [Slot] -> Slot slotListToSlot [] = error "slotListToSlot: empty list" slotListToSlot (x:xs) = x ,并且3.是不好的做法(使你的程序易受攻击,因为你的功能是部分的,而使用Maybe可以保证无崩溃功能。)

答案 1 :(得分:4)

如果您的代码中不需要任何内容​​但空列表出错,则可以执行

 slotListToSlot :: [Slot] -> Slot
 slotListToSlot [] = error "no slot for empty list"
 slotListToSlot (x:xs) = x

答案 2 :(得分:4)

根据您的问题,您似乎想要返回列表的第一个元素。

实际上没有必要自己实现这样的功能,因为已经存在一个通用函数:head :: [a] -> a

  

提取列表的第一个元素,该列表必须非空

当然,您无法返回空列表的 head 。在这种情况下,该函数将出错:

Prelude> head []
*** Exception: Prelude.head: empty list
Prelude Data.Maybe> head [1]
1
Prelude Data.Maybe> head [1,4]
1

通常万一有“特殊情况”,最好使用Maybe。例如,您可以使用:listToMaybe :: [a] -> Maybe a

  

listToMaybe函数在空列表中返回 Nothing Just a其中a第一个元素列表。

如果列表包含至少一个元素,则此函数将返回列表的头部(包含在Just中),否则为Nothing。例如:

Prelude> :m Data.Maybe
Prelude Data.Maybe> listToMaybe []
Nothing
Prelude Data.Maybe> listToMaybe [1]
Just 1
Prelude Data.Maybe> listToMaybe [1,4]
Just 1

现在类型(Maybe a)包含有两种情况的信息,然后调用函数可以(单独)处理它们。