gpt4 book ai didi

haskell - 为什么在 Haskell 中丢弃的值是 () 而不是 ⊥?

转载 作者:行者123 更新时间:2023-12-03 15:24:59 25 4
gpt4 key购买 nike

如何在 Haskell 中,当有一个值会被丢弃时,()用于代替 ?

示例(目前除了 IO 操作之外真的想不出任何东西):

mapM_ :: (Monad m) => (a -> m b) -> [a] -> m ()
foldM_ :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m ()
writeFile :: FilePath -> String -> IO ()

在严格的评估下,这完全有道理,但在 Haskell 中,它只会使域变大。

也许有“未使用的参数”函数 d -> ad 有严格要求(其中 d 是一个不受约束的类型参数,并且在 a 中不显示为自由)?例如: seq , const' x y = y序列 x .

最佳答案

我认为这是因为您需要指定要丢弃的值的类型。在 Haskell-98 中,()是显而易见的选择。只要你知道类型是() ,你也可以将值设为 ()以及(假设评估进行到那么远),以防有人试图对其进行模式匹配或其他事情。我认为大多数程序员不喜欢在代码中引入额外的⊥,因为这只是一个额外的陷阱。我当然避免它。

而不是 () , 可以创建一个无人居住的类型(当然 ⊥ 除外)。

{-# LANGUAGE EmptyDataDecls #-}

data Void

mapM_ :: (Monad m) => (a -> m b) -> [a] -> m Void

现在甚至不可能进行模式匹配,因为没有 Void构造函数。我怀疑不经常这样做的原因是因为它不兼容 Haskell-98,因为它需要 EmptyDataDecls 扩展。

编辑:你不能在 Void 上进行模式匹配,但是 seq会毁了你的一天。感谢@sacundim 指出这一点。

关于haskell - 为什么在 Haskell 中丢弃的值是 () 而不是 ⊥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11076938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com