如何使用 maybe 检测数独值

How to work with maybe to detect sudoku values

我想形成一个 Bool 的列表,以判断值是否适合数独格式。即 NothingJust x 其中 (1 <= x <= 9)。下面是我的代码:

import Data.Ix
import Data.Maybe

isSudokuValues :: (Ix a, Num a) => [Maybe a] -> [Bool]
isSudokuValues list = map (maybe True inRange(1, 9).fromJust) list

将实际值检查分解为对单个元素起作用的辅助函数要容易得多。这样你就可以很容易地看到你在哪里解压了 Maybe 值

isSudokuValues :: (Ix a, Num a) => [Maybe a] -> [Bool]
isSudokuValues =
  let
    isSudokuValue :: (Ix a, Num a) => Maybe a -> Bool
    isSudokuValue Nothing = True
    isSudokuValue (Just x) = inRange (1, 9) x
  in map isSudokuValue

我认为你犯了两个错误:

maybe 具有以下签名:

b -> (a -> b) -> Maybe a -> b

所以你应该使用:

map (maybe True $ inRange (1,9)) list

无法使用 fromJust,因为那时 maybe 将在 a 上工作(而不是 Maybe a,而且它是 [= 的任务之一13=] 只是为了允许安全的数据处理(这样你就不必担心值是否为 Nothing.

一些 Haskell 用户还考虑 fromJust to be harmfull:无法保证值是 Just,因此即使您设法让它与fromJust,它会在 Nothing 上出错,因为 fromJust 无法处理这些。 全面编程 是大多数 Haskell 程序员的目标之一。

演示ghci):

Prelude Data.Maybe Data.Ix> (map (maybe True $ inRange (1,9))) [Just 1, Just 15, Just 0, Nothing]
[True,False,False,True]
Prelude Data.Maybe Data.Ix> :t (map (maybe True $ inRange (1,9)))
(map (maybe True $ inRange (1,9))) :: (Num a, Ix a) => [Maybe a] -> [Bool]