我对Haskell很新,所以请理解我的问题有点愚蠢。实际上感觉就像。
所以我现在试着解决这个问题几个小时.. 我有这个
data Slot = Slot {
getTime :: Time,
getSubject :: Name
}
deriving(Show,Eq)
slotListToSlot :: [Slot] -> Slot
slotListToSlot [] = ???
slotListToSlot (x:xs) = x
编译器抱怨空插槽列表没有模式。 当然,问号只是为了显示缺少代码的位置。
此时我真的不知道该怎么做。 欢迎任何想法和帮助^^
答案 0 :(得分:5)
您有三种选择:
使用ng-repeat
:
Maybe
替代实现:在标准Data.Maybe包中使用listToMaybe
:
slotListToSlot :: [Slot] -> Maybe Slot
slotListToSlot [] = Nothing
slotListToSlot (x:xs) = Just x
slotListToSlot :: [Slot] -> Maybe Slot
slotListToSlot = listToMaybe
使用import Data.List.NonEmpty
slotListToSlot :: NonEmpty Slot -> Slot
slotListToSlot = neHead
:
error
我建议使用第一个选项,因为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
)包含有两种情况的信息,然后调用函数可以(单独)处理它们。