[英]Haskell Infinite Type
我正在嘗試使下面的代碼工作。 這是一個有限狀態機,我在其中傳遞了功能為下一個狀態。 該函數用r
調用,並返回結果列表和下一個作為下一個函數的狀態。 繼續調用直到列表用完,然后返回結果的串聯。 monad是一個錯誤monad,如果需要的話,允許我拋出一個錯誤。
fsm f [] = return []
fsm f (r:rs) = do
(xs, f') <- f r
rest <- fsm f' rs
return $ xs ++ rest
錯誤是:
Occurs check: cannot construct the infinite type: t1 = t0 -> m0 ([a0], t1)
In the first argument of `fsm', namely f'
我之前見過無限類型錯誤,並且我了解解決此問題的方法是用newtype
包裝類型。 但是我不知道如何完成這項工作。
有人可以指出這些見解嗎?
我認為這是您想要的:
newtype F m = F { unF :: String -> m ([String], F m) }
fsm :: (Monad m) => F m -> [String] -> m [String]
fsm f [] = return []
fsm f (r:rs) = do
(xs, f') <- unF f r
rest <- fsm f' rs
return $ xs ++ rest
正確的newtype
是,只要需要遞歸類型,就需要使用data
或新類型。
為了回應您的評論,以下是實現dup
功能的方法:
dup :: (Monad m) => F m
dup = F dup' where dup' xs = return ([xs, xs], F dup')
...或者您可以根據需要將其分為兩個單獨的定義。
請注意,如果不確定類型簽名應該是什么,只需啟用NoMonomorphismRestriction
擴展,編譯器就不會抱怨並正確地為您推斷頂級類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.