我试图弄清楚编写 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/

10-16 19:05