Haskell展开可能保持多态性

Haskell展开可能保持多态性,haskell,maybe,unwrap,Haskell,Maybe,Unwrap,哈斯克尔又是新手了。如果我想打开一个Maybe类型并使其保持抽象,我会使用: fUnwrap :: Maybe a -> a fUnwrap (Just n) = n fUnwrap Nothing = ??? 不管我什么都不用做,编译器总是唠叨着要更具体地说明什么都不用做。。。你们能帮帮我吗?这是合乎逻辑的。编译器解释了类型a的值,但这里没有可以提供的值,因为a可以是Bool、Int、[Int],可能是Int等等 这不是一个编程问题,更多的是一个设计问题:如果它是一个空的,你想做什

哈斯克尔又是新手了。如果我想打开一个Maybe类型并使其保持抽象,我会使用:

fUnwrap :: Maybe a -> a 
fUnwrap (Just n) = n 
fUnwrap Nothing = ???

不管我什么都不用做,编译器总是唠叨着要更具体地说明什么都不用做。。。你们能帮帮我吗?

这是合乎逻辑的。编译器解释了类型a的值,但这里没有可以提供的值,因为a可以是Bool、Int、[Int],可能是Int等等

这不是一个编程问题,更多的是一个设计问题:如果它是一个空的,你想做什么?这里有一些选项:

提供默认值,则签名为:

fUnwrap :: a -> Maybe a -> a 
fUnwrap _ (Just n) = n
fUnwrap d Nothing = d
我们返回未定义的:


在这里,前面的示例是someComputation,otherComputation::Int->Maybe Int.

这在编写函数时是不可能的。因为函数是纯函数,所以不能返回a,因为您唯一的输入是Nothing


也许的美妙之处在于你不需要打开它。仅当包装数据存在时,才可以使用fmap函数对其进行操作,而在“无”的情况下,则隐式不执行任何操作。

这不是一个好主意。您可以为Nothing添加一个默认值,也可以忽略该行,但如果它是一个Maybe,您将得到一个错误。是否有更大的问题要解决?如果是这样的话,你能描述一下吗?我确实意识到我可以对可能的类型进行操作,但重点是对JSON、XML等的输出。我不想要的只是,里面什么都没有,而是实际的值或。@Madderote在这种情况下使用maybay show。总是直接问你想知道什么非常清楚,威廉!我真正需要的是你的例子1。正如您所指出的,只是不希望用户遇到任何问题,并通过使用默认值来捕获它。也非常感谢您将此置于上下文中,并指出我的其他选项。限制为幺半群有什么错?打开包装,什么也不会回来mempty@AnthonyRaimondo:是的,但这只适用于幺半群,因为原始整数不是幺半群,而乘积是,这将导致在幺半群构造函数中进行大量的包装和展开。@Willem Van Onsem说得通,谢谢,我没有意识到整数不是幺半群!
fUnwrap :: Maybe a -> a
fUnwrap (Just n) = n
fUnwrap Nothing = error "Nothing has no value"
fUnwrap :: Maybe a -> a
fUnwrap (Just n) = n
fUnwrap Nothing = undefined
foo :: Int -> Maybe Int
foo x = do
    y <- someComputation x
    otherComputation y