我想知道是否有Applicative
可以跟蹤已發生多少應用操作。我試圖執行它如下:適用於增加haskell中的環境
import Control.Applicative
main :: IO()
main = print $ run 1 $ (,,,) <$> FromInt id <*> FromInt id <*> FromInt id <*> FromInt id
data FromInt a = FromInt (Int -> a)
run :: Int -> FromInt a -> a
run i (FromInt f) = f i
instance Functor FromInt where
fmap g (FromInt f) = FromInt (g . f)
instance Applicative FromInt where
pure a = FromInt (const a)
FromInt f <*> FromInt g = FromInt (\i -> f i (g (i + 1)))
但是,這當然不起作用。如果我們在文件中調用runhaskell,我們得到這樣的:
(1,2,2,2)
而我想是這樣的:
(1,2,3,4)
我見過的人推的要求完成這個效果遞增到實際數據(這是yesod-forms如何實現formlet風格的實現)。這或多或少使用State
上的變體,並且如果人們不使用特定的輔助函數(我認爲這個函數被稱爲mhelper
),它允許人們打破假定的不變量。我想知道增量是否可以像我試圖做的那樣進入應用實例。這會違反這個不變的不可能。
我不相信這是可能的,因爲應用性的行動不能依賴於先前的結果。要做到這一點,我認爲你必須有一個monad來獲得你想要的輸出。 – bheklilr
你不需要單子。 「State」的應用實例工作正常,但我希望有更好的方法。 –