【发布时间】:2014-08-23 23:25:51
【问题描述】:
我见过的几乎所有关于 State Monad 的示例都包含在 newtype 中。
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Control.Monad.State
import Control.Applicative
data Bazzar
= Bazzar {
valueOne :: Int
, valueTwo :: Int
}
newtype BazState a = BazState { unBazify :: State Bazzar a }
deriving (Functor, Applicative, Monad, MonadState Bazzar)
我有什么理由不应该只使用类型别名吗?
type BazState a = State Bazzar a
我意识到newtype 的目的是区分同一类型数据结构的两种不同用途,例如为现有类型重新实现类型类,或者如果您想将类型的使用与正常行为区分开来。或者实现其他类型类以使用该类
如果您没有做上述任何事情,在这种情况下使用newtype 不是只是不必要的间接吗?
【问题讨论】:
-
您不能为类型同义词定义实例。
-
你确定吗?我可以毫无问题地将
type Blah a = [(Int, a)]输入到ghci 中。哦等等,我只是重读了你说的话,这很公平。 -
问题是尽管我见过的大多数示例都没有实现任何额外的类型类。我会更新我的问题
-
它还可以让您的 api 以这样一种方式导出 monad 或其他类型的库,而无需导出它的构造函数,如果您将来需要更改底层类型,它会更容易在不破坏面向外的 API 的情况下这样做。
-
这是一个很好的观点,我实际上并没有将其视为一个用例,请随意回答问题。
标签: haskell state-monad newtype