maybe :: b -> (a -> b) -> Maybe a -> b -- Defined in `Data.Maybe'
根据这个定义,b可以是任何类型,并且应该与函数的返回值相同(a-> b) 但是当我在Winghci尝试这个时:
maybe (error "no") (head) (Just "hi")
'h'
maybe (error "no") (return) (Just "hi")
"hi"
两者都有效,但显然返回并且头部有不同的类型,但两者都有效(错误“否”) 当我输入:
:t error "no"
我得到了
error "no" :: a
这是否意味着错误“不”可以是任何类型? 为什么这样?
答案 0 :(得分:4)
> :t error
error :: [Char] -> a
error
需要String
,因此您可以告知用户问题是什么。
当它返回a
时,这是因为错误可能发生在程序的任何地方,所以如果它是“任何类型”,你可以在任何需要的地方设置错误。
例如:
函数head
具有签名
head :: [a] -> a
它显然会返回列表的头部。
但是如果我们给它一个空列表会发生什么。
Prelude> head ([] :: [Int])
*** Exception: Prelude.head: empty list
head
应该返回类型Int
,因为我们强制它在空列表中
Prelude> :t head ([] :: [Int])
head ([] :: [Int]) :: Int
那么我们可以返回什么类型Int
(对于这个特例)并向用户显示出错的地方?
error "empty list"
但我们需要Int
,因此a
的错误可以是任何内容,例如Int
head
的源代码如下:
head :: [a] -> a
head (x:_) = x
head [] = error "empty list"