記住,這反射程序:使用類型註釋編譯兩個函數。刪除一個註釋 - 不編譯。再次刪除兩個 - 編譯。爲什麼?
{-# LANGUAGE ScopedTypeVariables, RecursiveDo #-}
import Control.Applicative
import Control.Monad
import Control.Monad.IO.Class
import Prelude hiding (div)
import Reflex.Dom
import qualified Data.Map as M
clickMe :: MonadWidget t m => m (Event t())
clickMe = do
rec (e,_) <- elAttr' "button" M.empty (display c)
c :: Dynamic t Int <- count (domEvent Click e)
return $ domEvent Click e
div :: forall t m a . MonadWidget t m => m a -> m a
div = elAttr "div" ("style" =: "border : 1px solid black")
app :: forall t m . MonadWidget t m => m()
app = div $ do
aClicks <- clickMe
bClicks <- clickMe
a <- count aClicks
b <- count bClicks
l <- combineDyn (\a b -> replicate (a-b)()) a b
simpleList l (const clickMe)
return()
main = mainWidget app
如果您從任何div
或app
類型標註,該程序將無法與巨大的,可怕的錯誤類型編譯。 如果您同時刪除它,它會再次編譯。從程序員的角度來看,當有人試圖對一個未註釋的程序進行增量式註釋時,這會給用戶帶來可怕的體驗。將不正確的類型註釋添加到未註釋的術語會導致編譯器錯誤,並且會導致程序員認爲他的類型錯誤。
This is the error you get by removing div
's annotation.
爲什麼出現這種情況?
刪除類型時推斷的類型是什麼?他們如何與提供的類型進行比較?這是一種推測,但我認爲推斷或提供的類型之一不夠通用,因此呈現不兼容。另外添加推斷的類型可以幫助回答這個問題。 – concept3d
我已經在這個問題上包含了推斷類型,但我無法理解它們,因爲有蜘蛛。 – MaiaVictor
單態限制 –