我對Haskell是全新的,我找不到這個問題的答案。也許我在尋找錯誤的東西。Haskell比較IO UTCTime
我遇到了一個小應用程序需要兩個文件路徑和一個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
我得到的編譯錯誤:
Couldn't match expected type `UTCTime`
with actual type `IO UTCTime`
In the third argument of `doLoop`, namely `getCurrentTime`
getCurrentTime應該產生一個IO UTCTime
根據文檔,就像getCurrentTime
。我在這裏錯過了什麼?
如果您嘗試向'doLoop'添加類型簽名,您將會看到問題所在。一方面,你的'doLoop'期望它的第三個參數是'UTCTime',但是當你在'main'中調用它時,你給它一個'IO UTCTime'。嘗試將main更改爲:'main = do {currTime < - getCurrentTime; doLoop「FilePath」「FilePath」currTime}'(或者只是'main = doLoop「FilePath」「FilePath」=「currTime」)。 – Alec
工作就像一個魅力。非常感謝你!是否因爲缺乏「do」調用,Haskell期望一個非單參數的參數而不是IO UTCTime,即使我使用的函數只能產生單子結果? – Ozan
@Ozan不,它期望一個非'IO'的參數,因爲你把它傳遞給'(/ =)'以及另外一個非'IO'的東西。無論是使用'do'語法,還是最終產生'IO'都是相關的。 –