簡體   English   中英

Haskell無限類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM