主な用途は、次のとおり
- タイプの別のインスタンスを定義します。
- ドキュメント。
- データ/形式正当性保証。
私はnewtypesを広範囲に使用しているアプリケーションに取り組んでいます。 Haskellのnewtypes
は純粋にコンパイル時のコンセプトです。例えば。以下のアンラップでは、unFilename (Filename "x")
は "x"と同じコードにコンパイルされます。ランタイムヒットは全くゼロです。 data
タイプがあります。これは上記の目標を達成するのに非常に良い方法です。
-- | A file name (not a file path).
newtype Filename = Filename { unFilename :: String }
deriving (Show,Eq)
私は誤ってこれをファイルパスとして扱いたくありません。これはファイルパスではありません。これは、データベースのどこかの概念ファイルの名前です。
アルゴリズムが適切なものを参照することは非常に重要です。これはnewtypesが役に立ちます。セキュリティのためにも非常に重要です。たとえば、Webアプリケーションへのファイルのアップロードを考えます。私は、これらのタイプがあります。今から私は一意のファイル名を生成することを
-- | Sanitize a filename for saving to upload directory.
sanitizeFilename :: String --^Arbitrary filename.
-> SanitizedFilename --^Sanitized filename.
sanitizeFilename = SanitizedFilename . filter ok where
ok c = isDigit c || isLetter c || elem c "-_."
:
-- | Generate a unique filename.
uniqueFilename :: SanitizedFilename --^Sanitized filename.
-> IO UniqueFilename --^Unique filename.
を
-- | A sanitized (safe) filename.
newtype SanitizedFilename =
SanitizedFilename { unSafe :: String } deriving Show
-- | Unique, sanitized filename.
newtype UniqueFilename =
UniqueFilename { unUnique :: SanitizedFilename } deriving Show
-- | An uploaded file.
data File = File {
file_name :: String --^Uploaded file.
,file_location :: UniqueFilename --^Saved location.
,file_type :: String --^File type.
} deriving (Show)
は私がアップロードされたファイルからファイル名をきれいにこの機能があるとし
任意のファイル名から一意のファイル名を生成することは危険です。最初にサニタイズする必要があります。同様に、固有のファイル名は拡張子によって常に安全です。私は今すぐディスクにファイルを保存し、私がしたい場合は、そのファイル名をデータベースに入れることができます。
しかし、ラップしたりラップしたりしなければならない場合もあります。長期的には、私は価値の不一致を避けるためにそれを価値があると考えています。 ViewPatternsは多少役立つ:
-- | Get the form fields for a form.
formFields :: ConferenceId -> Controller [Field]
formFields (unConferenceId -> cid) = getFields where
... code using cid ..
たぶん、あなたは、関数でそれをアンラップが問題であると言うだろう - あなたは間違って関数にcid
を渡すと何?問題ではなく、会議IDを使用するすべての機能でConferenceIdタイプが使用されます。コンパイル時に強制される関数から関数レベルの契約システムの一種です。かなりいい。だから、私はできる限り頻繁に使用します。特に、大きなシステムではそうです。
Hrm ...私は受け入れられるように複数の回答をマークすることはできません。私は何とかこの問題に関する異なる意見の合理的な表現を受け入れることを望んでいた... – StevenC