私はハスケルを完全に新しくしており、私はこの問題に対する答えを見つけることができません。多分私は間違ったことを探していたでしょう。ハスケルはIO UTCTimeを比較しています
私は2つのファイルパスとIO UTCTime
タイムスタンプを取ることになっている小さなスクリプトに問題があります。アイデアは、ディレクトリが変更されたかどうかを5秒ごとにチェックすることです。私は簡単にするためにスクリプトの詳細を省略しています。私はコンパイルエラーを取得しています
import Data.List
import Control.Monad
import Control.Concurrent
import System.Directory
import Data.Time.Clock
main = doLoop "FilePath" "FilePath" getCurrentTime
doLoop lastPath currentPath lastModified = do
modified <- getModificationTime currentPath
if (lastModified /= modified)
then print "Success"
else do threadDelay 5000000
doLoop "FilePath" "FilePath" lastModified
:それはつまるところgetCurrentTimeはちょうどgetCurrentTime
のように、マニュアルに従ってIO UTCTime
生成することになっている
Couldn't match expected type `UTCTime`
with actual type `IO UTCTime`
In the third argument of `doLoop`, namely `getCurrentTime`
。私はここで何が欠けていますか?
型署名を 'doLoop'に追加しようとすると、問題の内容がわかります。一方、 'doLoop'は3番目の引数が' UTCTime'であることを期待していますが、 'main'で呼び出すときに' IO UTCTime'を与えます。 mainを次のように変更してみてください: 'main = do {currTime < - getCurrentTime; doLoop "FilePath" "FilePath" currTime} '(または単に' main = doLoop "FilePath" "FilePath" = "currTime'をあなたが傾けている場合)。 – Alec
チャームのように働いた。どうもありがとうございました!ハスケルがIO UTCTimeの代わりに非モナド的な引数を期待していた "do"コールがないためです。私が使用した関数はモナド結果しか生成できませんでした。 – Ozan
@Ozanいいえ、 'IO'以外のものと一緒に'(/ =) 'に渡すので、非'IO'引数が必要です。 'do'構文を使うのか、最後に' IO'を作るのかは全く関係ありません。 –