簡體   English   中英

為什么不能在Haskell中的實例聲明中放置類型簽名?

[英]Why can't one put type signatures in instance declarations in Haskell?

我喜歡在我的代碼中為所有頂級定義添加類型簽名。 但是,實例聲明中的類型簽名似乎不被允許,如果我放置一個,我會從GHC獲得“錯位類型簽名”錯誤。 為什么會這樣? 為什么GHC不能檢查類型簽名是否與預期相同,如果不是,則拒絕(或警告)?

您可以使用[new] -XInstanceSigs為實例添加類型簽名,這對於在范圍中引入類型變量特別有用。 您可以在官方文檔中找到更多信息。

如果您真的需要類型聲明,則可以在實例主體外單獨創建函數。

class Class a where
    f1 :: a -> a

instance Class Foo where
    f1 = foo_f1

--monomorphic version of f1 for Foo:
foo_f1 :: Foo -> Foo
foo_f1 = ...

這里的大多數其他答案都很古老......現在有一種語言擴展:

在文件頂部粘貼以下內容:

{-# Language InstanceSigs #-}

由於簽名是類定義的一部分,因此實例聲明中的類型簽名將是重復簽名。 我認為原則上不允許重復簽名存在問題,但通常允許它們沒有優勢,並且不允許它們更簡單。 所以語言定義說每個實體最多只能有一個類型簽名。 在實例聲明中允許簽名的功能還沒有被要求太多,因此沒有允許它的擴展。 如果您真的想要,可以在GHC trac上提出功能請求。 如果它獲得足夠的興趣,它可能會實現(但我不認為需求很高)。

在任何情況下,類型都是冗余的,並且通常希望避免冗余。 Frege中 ,仍允許為實例成員編寫類型簽名。 他們被檢查然后扔掉。 當然更容易立即禁止他們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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