haskell 创建新算子,并控制错误

haskell create new operator, and control error

我有以下结构:

Terra [['0','1','0','1'],['0','1','0','1'],['1','0 ','G','1']]

并取消功能:

esTerra:: Taulell -> (Int,Int) -> Bool
esTerra t (u,d) = 
    case t!!!u!!!d of
        Left e -> False
        Right p -> True


(!!!) :: [a] -> Int -> Either Bool a 
xs !!! n | n < 0 = Left False   -- error Exception: Prelude.!!:...
[] !!! _ = Left False           -- error Exception: Prelude.!!:...
(x:_) !!! 0 = Right x
(_:xs) !!! n = xs!!!(n-1)

函数!!!等于运算!!但是当你必须 return 一条错误消息时 returns False

但 return 错误:

Couldn't match expected type ‘[a0]’
            with actual type ‘Either Bool [Char]’
In the first argument of ‘(!!!)’, namely ‘t !!! u’
In the expression: t !!! u !!! d
In the expression:
  case t !!! u !!! d of {
    Left e -> False
    Right p -> True }

因为?

谢谢

我不知道 Taulell 是什么,让我们猜猜 Taulell = [[a]] 对于某些 a

我们有

t :: [[a]]  -- Taulell
u :: Int
d :: Int

因此

t !!! u :: Either Bool [a]

然后我们写

(t !!! u) !!! d

但这里最左边的参数不是列表,而是 Either Bool [a]。因此出现类型错误。

相反,我们可以尝试,例如

case t !!! u of
   Left b -> ...
   Right l -> case l !!! d of
                 Left c  -> ...
                 Rigth w -> ...

!!! 需要一个列表作为其左参数,但对于嵌套列表,它不会给出简单列表作为结果。结果为 Either Bool [a]

您不能再次将其用作 !!! 的参数,但您可以很容易地 !!! 应用到 Either -包含列表:

esTerra:: Taulell -> (Int,Int) -> Bool
esTerra t (u,d) = 
    case t!!!u >>= (!!!d) of
        Left e -> False
        Right p -> True

在这里,我使用了单子绑定运算符 >>= to combine two possibly-failing lookups into one, which will succeed only if both lookups do. This is equivalent to twice explicitly unwrapping the Either structure with a case construct,