Haskell 中的联合类型 (a -> b | IO b)?

Fun*_*tor -2 haskell

我需要定义一个联合类型,该类型的集合包括

\n

a -> b 或者 a -> IO b

\n

a -> b || a -> IO b

\n

或者

\n

a -> b | IO b

\n

foo :: (a -> b | IO b) -> IO (R a) -> IO (R b)

\n

我试过data unionType b = b | IO b,不行。

\n
Not a data constructor: \xe2\x80\x98b\xe2\x80\x99parser\nNo quick fixes available\n
Run Code Online (Sandbox Code Playgroud)\n

在哈斯克尔可以吗?

\n

K. *_*uhr 5

在 Haskell 中,求和类型(不相交联合类型的标准术语)需要为其组件显式“构造函数”,因此您需要编写如下内容:

data BarType b = BarPure b | BarIO (IO b)
Run Code Online (Sandbox Code Playgroud)

这定义了一个 type BarType,并且还定义了构造函数BarPureBarIO用于构造该类型的值:

val1, val2 :: BarType String
val1 = BarPure "pure"
val2 = BarIO getLine
Run Code Online (Sandbox Code Playgroud)

并通过大小写匹配使用这种类型的值:

runBar :: BarType b -> IO b
runBar barb = case barb of
  BarPure s -> pure s
  BarIO act -> act
Run Code Online (Sandbox Code Playgroud)

  • ...但是如果您要做的只是接受其中之一作为函数参数,那么您不妨编写 `barPure = return; barIO = id` 并接受 `IO b` 而不是 `BarType b`。 (5认同)