Haskell中的约束值类型

Fil*_*erg 5 haskell types functional-programming immutability value-type

是否有可能在Haskell中定义约束类型,即我希望能够表达,

Prelude> let legalCharacters = ' ':['A'..'Z']
Prelude> legalCharacters
" ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Run Code Online (Sandbox Code Playgroud)

作为一种类型,如果可能的话.

lef*_*out 14

可以在现代GHC中完成(> = 7.10,也许已经是7.8).

{-# LANGUAGE KindSignatures, DataKinds, MonoLocalBinds #-}
import GHC.TypeLits

newtype LegalChar (legalSet :: Symbol)
   = LegalChar {getLegalChar :: Char}
  deriving (Show)

fromChar :: KnownSymbol legal => Char -> Maybe (LegalChar legal)
fromChar c
   | c`elem`symbolVal r = Just r
   | otherwise          = Nothing
 where r = LegalChar c
Run Code Online (Sandbox Code Playgroud)

然后

*Main> fromChar 'a' :: Maybe (LegalChar "abc")
Just (LegalChar {getLegalChar = 'a'})
*Main> fromChar 'x' :: Maybe (LegalChar "abc")
Nothing
Run Code Online (Sandbox Code Playgroud)

我认为在GHC-8中,您甚至可以提供legalSet类型String并取消KnownSymbol约束,但不确定它是如何工作的.

  • @jpath它实际上可以推断出这个,​​但只有在启用了`-XMonoLocalBinds`时.我没注意到,因为我的`.ghci`文件中有`-XGADTs`,这意味着`-XMonoLocalBinds`. (2认同)