首页 > 解决方案 > Haskell:将新类型视为字符串

问题描述

我经常有这个简单的模式:

newtype Username = Username Text

目的当然是在操作“用户名”时提高安全性,而不是将其与其他字段混合。但是,一直打包和拆包变得乏味。我想知道是否有将“用户名”视为字符串(例如 AsString 或 OverloadedStrings)的技巧,或者它是否违背了目的?

标签: haskell

解决方案


我认为你的newtype方法是一个很好的方法。你必须问自己为什么你一直需要打包和拆包。对于这样的类型,您通常应该有一个定义它的模块、一堆乏味的类型类实例和一些操作函数。你把它敲出来。

{-# language GeneralizedNewtypeDeriving #-}

module MyNamespace.Username (.....) where
import Data.Hashable

newtype Username = Username Text
  deriving (Eq, Ord, Show, Hashable)

unUsername :: Username -> Text
validateForm :: Text -> Maybe Username

推荐阅读