创建一个类型,该类型是其他类型的子集

Hen*_*enk 2 haskell types

如何创建属于其他类型子集的类型?我想要一个只包含字母数字字符的字符串类型.

所以我想要这样的东西

type AlphNumString = [AlphaNumChar]
data AlphaNumChar = ???? filter (isAlphaNum) Char ????
Run Code Online (Sandbox Code Playgroud)

Mat*_*hid 7

执行此操作的标准方法是使用所谓的"智能构造器".

首先,定义一个与旧类型相同的新类型:

newtype AlphNumString = X String
Run Code Online (Sandbox Code Playgroud)

接下来,您编写智能构造函数本身:

toAlphNumString :: String -> AlphNumString
toAlphNumString txt = X (filter isAlphNum txt)
Run Code Online (Sandbox Code Playgroud)

最后,你做到这一点toAlphNumString是创建一个的唯一方法AlphNumString.

module Foo (AlphNumString (), toAlphNumString, ...) where ...
Run Code Online (Sandbox Code Playgroud)

请注意,这并没有让你使用AlphNumString像一个正常的String; 你不能在Haskell中创建像那样的"子类型".所以你还需要另一个功能

fromAlphNumString :: AlphNumString -> String
fromAlphNumString (X txt) = txt
Run Code Online (Sandbox Code Playgroud)