List Haskell中的非穷举模式
我是哈斯克尔的新手,所以请理解我的问题有点傻。事实上,感觉就像这样 所以我已经试着解决这个问题好几个小时了。。 我有这个List Haskell中的非穷举模式,list,haskell,List,Haskell,我是哈斯克尔的新手,所以请理解我的问题有点傻。事实上,感觉就像这样 所以我已经试着解决这个问题好几个小时了。。 我有这个 data Slot = Slot { getTime :: Time, getSubject :: Name } deriving(Show,Eq) slotListToSlot :: [Slot] -> Slot slotListToSlot [] = ??? slotListToSlot
data Slot = Slot {
getTime :: Time,
getSubject :: Name
}
deriving(Show,Eq)
slotListToSlot :: [Slot] -> Slot
slotListToSlot [] = ???
slotListToSlot (x:xs) = x
编译器抱怨没有插槽空列表的模式。
当然,问号只是为了显示代码缺失的地方
现在我真的不知道该怎么办。
欢迎提供任何想法和帮助^^如果您不希望代码中有任何内容,但空列表出现错误,您可以这样做
slotListToSlot :: [Slot] -> Slot
slotListToSlot [] = error "no slot for empty list"
slotListToSlot (x:xs) = x
根据您的问题,您似乎希望返回列表的第一个元素 实际上不需要自己实现这样的函数,因为已经有一个泛型函数: 提取列表的第一个元素,该元素必须是非空的 当然,现在不能返回空列表的标题。在这种情况下,函数将出错:
Prelude> head []
*** Exception: Prelude.head: empty list
Prelude Data.Maybe> head [1]
1
Prelude Data.Maybe> head [1,4]
1
通常情况下,如果出现“特殊情况”,最好使用或。例如,您可以使用:
listtomabe
函数在一个空列表上返回不返回任何内容
,或者只返回一个,其中a
是列表的第一个元素
因此,如果列表中至少包含一个元素,则此函数将返回列表的标题(仅包装在中
),否则不返回任何内容
。例如:
Prelude> :m Data.Maybe
Prelude Data.Maybe> listToMaybe []
Nothing
Prelude Data.Maybe> listToMaybe [1]
Just 1
Prelude Data.Maybe> listToMaybe [1,4]
Just 1
现在类型(可能是a
)包含有两种情况的信息,然后调用函数可以(分别)处理这些情况。您有三个选项:
使用可能
:
slotListToSlot :: [Slot] -> Maybe Slot
slotListToSlot [] = Nothing
slotListToSlot (x:xs) = Just x
替代实现:在标准数据中使用。可能包:
slotListToSlot :: [Slot] -> Maybe Slot
slotListToSlot = listToMaybe
使用:
使用错误:
slotListToSlot :: [Slot] -> Slot
slotListToSlot [] = error "slotListToSlot: empty list"
slotListToSlot (x:xs) = x
我建议使用第一个选项,因为2。是不实用的,除非您在程序中的任何地方都使用NonEmpty
,以及3。是错误的做法(使您的程序易受攻击,因为您的函数是部分的,而使用可能会保证无崩溃的函数)。那么SlotListSlot
应该做什么呢?等等,这是您文件中的实际代码吗,?
确实出现了?@luqui:根据文本,我想说文件中没有这样的行。OP只提到这一点来表示实际问题。您可以使用undefined
作为您打算稍后填充的模式的临时占位符,例如,slotListToSlot[]=undefined
。小心:编译器不会提醒您未定义模式!所有答案都假定OP想要列表中的第一项。OP能否确认是slotListToSlot
函数的预期行为?下面是一个完美答案的示例,专家们非常乐于阅读:)每个案例都有解释!只需选择一个,非常非常好,感谢分享:)还有另一个选择:根本不写slotListToSlot
,只需在您计划调用它的地方使用case
。(你可能会发现,不管怎样,使用建议的第一个选项,你都会这样做。)@DanielWagner这取决于代码中当前使用SlotListSlot
的频率。但是,有了像slotListToSlot=listToMaybe
这样的定义,您确实可以直接使用listToMaybe
。哇,谢谢!现在我知道如何使用“也许”:)不要忘记接受任何回答!
slotListToSlot :: [Slot] -> Slot
slotListToSlot [] = error "slotListToSlot: empty list"
slotListToSlot (x:xs) = x