7

学校での記憶が正しければ、「未実装」に使用される関数またはキーワードがありますが、コードはコンパイルされます。私はそれを検索しようとしましたが、見つかりません。私が探しているものを知っている人はいますか?

のようなものです

isDivisor :: Integer -> Integer -> Bool
isDivisor x y = None
--isDivisor x y = (rem x y) == 0
4

1 に答える 1

8

あなたが考えていることはbottom

ボトムは、何かが実装されていないことを示すだけではなく、プログラムが失敗する原因となる計算を表すことを意図しています。

たとえば、実際にundefined自分自身を無限ループとして定義できます

undefined = let x = x in x
undefined = undefined

つまり、実際に行っているのはundefined :: a、プログラムをクラッシュまたは永久にループさせる値を入力するだけで、それを評価することはありません。

したがって、実装方法がわからない大きくて複雑な関数がある場合は、これを実行できます

foo :: Bar -> Baz -> Quux
foo bar baz = foo bar baz

これは型チェックを行うため、コンパイルされ、プログラムの他の部分をテストできます。

ただし、プログラムのその部分を誤って実行したときに無限ループが発生するのはかなり役に立たないため、GHC などは別の方法で実装undefinedしています。プログラムをクラッシュさせ、エラー メッセージを表示させます。

-- In GHC
error msg = throw (ErrorCall s)
undefined = error "Prelude.undefined"

したがって、デバッグ機能を向上させて関数を未定義のままにする

foo bar baz = undefined
foo bar baz = error ("Tried to evaluate foo with" ++ show bar ++ show baz)

ボトムの概念がわかりにくい場合は、hammar が素晴らしい回答を投稿しました

于 2013-05-22T13:47:53.617 に答える