Haskell和条件数据结构

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章.


Rom*_*aka 6

例如,使用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)