gpt4 book ai didi

haskell - Haskell 中的约束值类型

转载 作者:行者123 更新时间:2023-12-04 16:42:34 25 4
gpt4 key购买 nike

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

Prelude> let legalCharacters = ' ':['A'..'Z']
Prelude> legalCharacters
" ABCDEFGHIJKLMNOPQRSTUVWXYZ"

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

最佳答案

可以在现代 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

然后
*Main> fromChar 'a' :: Maybe (LegalChar "abc")
Just (LegalChar {getLegalChar = 'a'})
*Main> fromChar 'x' :: Maybe (LegalChar "abc")
Nothing

我认为在 GHC-8 中你甚至可以给 legalSet那种 String并取消 KnownSymbol约束,不确定这将如何工作。

关于haskell - Haskell 中的约束值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41466132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com