在Haskell中,如何在不创建单独函数的情况下使用"head"?

ban*_*uth 3 haskell head

我对使用Haskell非常陌生,我不确定'head'是如何工作的.根据我的理解,它返回列表中的第一个元素.我一直在尝试使用它,但我一直在收到错误.我通过创建一个找到头部的单独函数添加了一个解决方法,但是看起来它应该是不必要的.

我不明白为什么在这里调用findHead:

single x = length (snd(x)) == 1

toList board
    | board == [] = []
    | otherwise = filter single board

findHead board = head (toList board)
Run Code Online (Sandbox Code Playgroud)

不等于在这里调用toList:

single x = length (snd(x)) == 1

toList board
    | board == [] = []
    | otherwise =  head (filter single board)
Run Code Online (Sandbox Code Playgroud)

在我看来,两者应该是相同的,但只有第一个运行.他们为什么不被解释为相同?你能解释一下吗?在上面的代码中,'board'是一个元组列表,每个元组都是形式(x,[a,b,...]).

我在一些简单的事情中使用了'head',例如:

union xs ys 
  | xs == [] = ys
  | ys == [] = xs
  | otherwise = union (tail xs)  (add (head xs) ys)
Run Code Online (Sandbox Code Playgroud)

这看起来像我期望的那样工作.

J. *_*son 8

head部分的.特别是,head []不能正常返回(抛出异常).这在Haskell中很难处理,这就是人们经常建议你避免部分功能的原因.

那我们该怎么做呢?我们必须反映类型的失败.

safeHead :: [a] -> Maybe a
safeHead []     = Nothing
safeHead (a:as) = Just a
Run Code Online (Sandbox Code Playgroud)

可以进行类似的功能 tail

safeTail :: [a] -> Maybe [a]
safeTail []     = Nothing
safeTail (a:as) = Just as
Run Code Online (Sandbox Code Playgroud)