2

トータルハスケルヌーブはこちら。シンプルな機能とメインがあります。このエラーが何を意味するのかわかりません。

Couldn't match expected type `IO t0' with actual type `Bool'
In the expression: main
When checking the type of the function `main'

コードをコンパイルするとき:

is_instructor :: String -> Bool
is_instructor "Jeremy Erickson" = True
is_instructor x = False

main :: Bool
main = is_instructor "foo"
4

3 に答える 3

4

mainプログラムを実行するときに呼び出されるものです。プログラムは何らかの形で外界と相互作用することが期待されます(読み取り入力、印刷出力など)。したがって、amainはタイプを持っている必要がありIO somethingます。型の安全性と単純さの理由から、これはHaskellの要件でmainあり、Javaの場合と同様に型が必要public static void main(String[] arrgh)です。

あなたはおそらくあなたが印刷されることを大切にしたかったので、

main :: IO ()
main = print $ is_instructor "foo"

あなたが望むものになります。

于 2012-04-11T14:01:53.643 に答える
2

mainタイプを持つ関数を持つことはできません、それは常にモナドBoolにある必要があります。IOおそらく必要なのは、このブール値を出力するようなものです。それならそれをしてください!

main :: IO()
main = print $ is_instructor "foo"
于 2012-04-11T13:56:25.730 に答える
2

Haskellは純粋に関数型言語だと聞いたことがあるでしょう。これは、(とりわけ)Haskellで関数が実行できるのは、引数に依存する結果を計算することだけであることを意味します。関数はI/Oを実行できないか、引数の値以外に依存する結果を得ることができません。

しかし、HaskellではI/Oやその他の効果的なことを行うプログラムを書くことができます。これはどのように可能ですか?つまり、Haskellでは、I/Oや副作用を実行するものは機能ではないということです。それらは別のものです。人々はしばしばそれらを行動と呼びます。HaskellのI/Oアクションには、次の形式のタイプがありますIO a

ここで発生するエラーはmain、Haskellプログラムへのエントリポイントであるがタイプのアクションである必要があるということですIO ()。ただしis_instructor、は型の関数でString -> Boolありis_instructor "foo"Boolです。

Haskellでは、そのような純粋関数とアクションを無計画に組み合わせて使用​​することはできません。関数の適用とアクションの実行は2つの異なるものであり、異なるコードが必要になります。

于 2012-04-11T19:03:56.840 に答える