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"

どちらも機能しますが、明らかに戻り、頭には異なるタイプがありますが、両方とも機能します(エラー「いいえ」) 入力すると:

:t error "no"

私は得る

error "no" :: a

これは、エラー「いいえ」がどのタイプでもかまいませんか? なんでそうなの ?

4

1 に答える 1

4
> :t error
error :: [Char] -> a

errorString取得して、ユーザーに問題を知らせることができます。

を返すaのは、プログラムのどこでもエラーが発生する可能性があるためです。そのため、「任意の型」であれば、必要な場所にエラーを設定できます。

例えば:

関数headには署名があります

head :: [a] -> a

明らかにリストの先頭を返します。

しかし、空のリストを与えるとどうなるでしょうか。

Prelude> head ([] :: [Int])
*** Exception: Prelude.head: empty list

headInt空のリストに強制したため、型を返すことになっていました

Prelude> :t head ([] :: [Int])
head ([] :: [Int]) :: Int

では、(この特定のケースでは) 何を返すことができInt、何かがうまくいかなかったことをユーザーに示すことができますか?

error "empty list"

しかし、それが である必要があるIntので、 であるとしてのエラーはaInt

のソースコードheadは次のようになります。

head :: [a] -> a
head (x:_) = x
head []    = error "empty list"
于 2013-07-19T01:18:12.537 に答える