我试图弄清楚编写 assert(0)
的 Haskell 等价物的最佳实践是什么。我知道类型安全规定必须从 scanList
返回一个整数,但是我想知道是否有比我写的更好的方法。有什么办法可以避免卡在那里的任意数字 923
吗?
module Main (main) where
import Control.Exception (assert)
l = [
Left "1",
Left "1",
Right 1,
Right 1,
Left "9"]
scanList :: [ Either String Int ] -> Int
scanList [ ] = 0
scanList (x:xs) = case x of
Right i -> i + scanList xs
Left s ->
if read s < 8
then read s + scanList xs
else assert False $ 923
main = do
print $ scanList l
最佳答案
从 assert
的文档中:
因此,您可以实际检查您的 False
条件,而不是将 if
作为第一个参数:
scanList (x:xs) = case x of
Right i -> i + scanList xs
Left s ->
assert (read s < 8) (read s + scanList xs)
关于Haskell 等价于 assert(0),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54624405/