wen*_*wen 3 haskell types data-structures
有可能写出类似的东西:
data SomeData = SomeValue | (Integral a) => SomeConstructor a
Run Code Online (Sandbox Code Playgroud)
一个人怎么写这个呢?
Pau*_*icz 12
这类似于Daniel Pratt的回答,但更典型的方法是在数据定义上省略类型约束,如下所示:
data SomeData a = SomeValue
| SomeConstructor a
Run Code Online (Sandbox Code Playgroud)
相反,您应该将(Integral a)约束放在需要它的任何函数上,即使您也将约束添加到数据定义中,您也必须这样做.对数据定义施加约束不会给你带来任何好处,但会迫使你对所有使用的约束进行约束SomeData,即使是那些根本不关心什么的约束a.有关更多信息,请参阅Real World Haskell的第10章.
例如,使用GADT:
{-# LANGUAGE GADTs #-}
data SomeData
where
SomeValue :: SomeData
SomeConstructor :: Integral a => a -> SomeData
Run Code Online (Sandbox Code Playgroud)
用法示例:
*Main> :t SomeValue
SomeValue :: SomeData
*Main> :t SomeConstructor 15
SomeConstructor 15 :: SomeData
*Main> :t SomeConstructor "aaa"
<interactive>:1:0:
No instance for (Integral [Char])
arising from a use of `SomeConstructor' at <interactive>:1:0-20
Possible fix: add an instance declaration for (Integral [Char])
In the expression: SomeConstructor "aaa"
*Main> let x = SomeConstructor 15 in case x of { SomeConstructor p -> fromIntegral p :: Int }
15
Run Code Online (Sandbox Code Playgroud)