Haskell可能会让人困惑

时间:2013-07-18 23:33:15

标签: haskell

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

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

1 个答案:

答案 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"