簡體   English   中英

Haskell - 非法多態類型?

[英]Haskell - Illegal Polymorphic type?

為什么這種類型的單一用法編譯,但將其放入列表失敗?

ft1  :: (Foldable t, Num a) => t a -> a
ft1   =   (F.foldl (+)  0)

fTest :: [(Foldable t, Num a) => t a -> a ]
fTest = [ F.foldl (+)  0 ]

后者給出錯誤:

folding.hs:80:10:
    Illegal polymorphic or qualified type:
      (Foldable t, Num a) => t a -> a
    Perhaps you intended to use ImpredicativeTypes
    In the type signature for `fTest':
      fTest :: [(Foldable t, Num a) => t a -> a]

Simliarly,嘗試命名它失敗(不同):

type Ftst t a = (Foldable t, Num a) => t a -> a

folding.hs:80:1:
    Illegal polymorphic or qualified type:
      (Foldable t, Num a) => t a -> a
    Perhaps you intended to use RankNTypes or Rank2Types
    In the type declaration for `Ftst'

對Haskell類型系統的這種限制是為了簡化類型推斷和檢查。 具有預測秩-1類型的類型推斷(見下文)是可判定的並且具有相對簡單的實現。 具有rank-2類型的類型推斷是可判定的但非常復雜,以至於我不知道任何具有rank-2類型推斷的實現的語言。 3級及以上類型的類型推斷是不可判定的。 令人印象深刻的類型也使事情變得復雜; GHC曾經有一個實現,它允許使用impredicative類型進行類型檢查(以及一些非常有限的推斷),但是它太復雜了以至於后來被刪除了。 (目前GHC仍然接受了一些僅具有預測類型的類型值,但我認為這不是一個“穩定”特征。)

快速定義:rank-1類型具有“外部”類型的所有量化和類約束,因此所有rank-1類型都具有

forall a_1 ... a_m. (C_1, ..., C_n) => t

Rank-2類型允許函數參數具有rank-1類型; 一般來說,n個類型允許函數參數具有rank(n-1)類型。

Predicativity回答了什么類型可以替代類型變量的問題。 如果只能替換單態類型(盡管可能帶有類型變量!),那么您就處於一個預測系統中; impredicative類型允許您將多態類型替換為類型變量。 通過擴展,預測系統中的參數數據類型只能接受單態類型作為參數。 因此,例如,您的示例將[]類型構造函數應用於類型forall t a. (Foldable t, Num a) => ta -> a forall t a. (Foldable t, Num a) => ta -> a試圖將構造函數應用於多態類型,因此僅在impredicative系統中有效。

暫無
暫無

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

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