tâm chương trình Reflex này:Hai chức năng biên dịch với chú thích kiểu. Xóa một chú thích - không biên dịch. Loại bỏ hai - biên dịch một lần nữa. Tại sao?
{-# 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
Nếu bạn loại bỏ các loại chú thích từ một trong hai div
hoặc app
, chương trình sẽ không biên dịch với một lỗi loại khổng lồ đáng sợ. Nếu bạn xóa cả hai, nó sẽ biên dịch lại. Từ quan điểm của một lập trình viên, điều này mang lại trải nghiệm người dùng khủng khiếp khi ai đó đang cố gắng chú thích từng bước một chương trình không được báo cáo. Nó không có ý nghĩa rằng việc thêm một chú thích kiểu đúng vào một thuật ngữ không được viện dẫn sẽ gây ra lỗi trình biên dịch, và nó dẫn người lập trình nghĩ rằng anh ta có kiểu sai.
This is the error you get by removing div
's annotation.
Tại sao điều này xảy ra?
Loại suy ra khi bạn loại bỏ các loại là gì? Làm thế nào để họ so sánh với các loại được cung cấp? Đây là một suy đoán nhưng tôi nghĩ rằng một trong những loại suy ra hoặc cung cấp không phải là chung chung đủ và do đó kết xuất không tương thích. Ngoài ra, việc thêm các loại suy luận có thể giúp trả lời câu hỏi. – concept3d
Tôi đã bao gồm các loại suy luận về câu hỏi ngay bây giờ, mặc dù tôi không thể hiểu chúng như có nhện. – MaiaVictor
hạn chế monomorphism –