我想要一个接受参数并返回
Maybe
值的函数。如果参数的类型为 Maybe a
,则实现应为 id
,如果参数为其他类型,则实现应为 Just
。当然,正确的方法是使用类型类,但我正在努力使其正确。有什么建议吗?
main :: IO ()
main = do
print $ toMaybe 3 -- should be `Just 3`
print $ toMaybe (Just 3) -- should be `Just 3` also
我觉得如果我知道正确的语言语法或其他东西,这可能是微不足道的,但我不知道。
您需要
TypeFamilies
,并且可能需要 DerivingVia
+StandaloneDeriving
。
class Wrap a where
type Wrapped a
wrap :: a -> Wrapped a
instance Wrap (Maybe a) where
type Wrapped (Maybe a) = Maybe a
wrap = id
newtype UseJust a = UseJust a
instance Wrap (UseJust a) where
type Wrapped (UseJust a) = Maybe a
wrap (UseJust a) = Just a
deriving instance Wrap Int via UseJust Int
deriving instance Wrap Bool via UseJust Bool
deriving instance Wrap () via UseJust ()
-- etc. etc.