Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell中的非穷举模式_List_Haskell - Fatal编程技术网

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