如何使用 maybe 检测数独值
How to work with maybe to detect sudoku values
我想形成一个 Bool
的列表,以判断值是否适合数独格式。即 Nothing
或 Just 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]
我想形成一个 Bool
的列表,以判断值是否适合数独格式。即 Nothing
或 Just 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]