data Binary = 0 | 1
是不正常的定義數據類型的形式。 data
定義需要數據構造函數和0
和1
對於它們來說不是合法語法,因爲它們已經用於數字文字。這是第二條錯誤消息試圖告訴你的,並且是基本的Haskell。對於數據構造最常見的語法是一個大寫的話,那麼你可能想要的東西更像
data Binary = Zero | One
注意:此消息的其餘部分是先進的東西,你可能不需要,但我覺得解釋關於你爲什麼得到第一個關於-XDataKinds
的錯誤消息。
隨着DataKinds
延伸,0
和1
做了別樣的成爲合法的「類型」(被稱爲Nat
,而事實上「厚道」是這裏的技術術語),用於高級型級別的編程,並與還有幾個擴展它是可能獲得包含它們的數據定義。
請注意,下面的例子可能不是真的有用,我只是拼湊在一起,以顯示它是可能的。在實踐中,除非你在做相當先進的東西,data Binary = Zero | One
可能更像你想要的。
{-# LANGUAGE DataKinds, KindSignatures #-}
import GHC.TypeLits (Nat)
data Proxy (n :: Nat) = Proxy
data WeirdBinary = Zero (Proxy 0) | One (Proxy 1)
我還沒有真正能夠使工作(雖然我只嘗試了一會兒)是什麼,開始data Binary = 0
。我得到的最接近像
class (n :: Nat) /// a where
data Binary = (0 /// Bool) => ThisIsSilly
奇怪的東西,其中0
仍需要在括號內。我想邏輯上這種特殊的形式應該沒有括號的工作,但它不。
鑑於此,我認爲Haskell正在被不必要地混淆,因爲暗示有一些方法可以使擴展符合0
。然而,使用分析和類型/類型檢查的方式在GHC中是分開的階段,以更加用戶友好的方式來捕捉它可能過於複雜,甚至最終可能意味着未來有效。