3
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"

两者都有效,但显然 return 和 head 具有不同的类型,但两者都可以使用(错误“no”)当我输入:

:t error "no"

我明白了

error "no" :: a

这是否意味着错误“否”可以是任何类型?为什么这样 ?

4

1 回答 1

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"
于 2013-07-19T01:18:12.537 回答