haskell创建新的运算符,并控制错误

时间:2016-04-04 21:56:14

标签: function haskell types operation

我有以下结构:

Terra [[' 0',' 1',' 0',' 1'],[' 0&# 39;,' 1'' 0'' 1'],[' 1'' 0&#39 ;, ' G'' 1']]

和de function:

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)

功能!!!等于操作!!但是当你必须返回错误信息时返回False

但返回错误:

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 }

由于?

感谢&#39; S

2 个答案:

答案 0 :(得分:2)

我不知道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 -> ...

答案 1 :(得分:1)

fun allDigits s = let fun f i = Char.isDigit (String.sub (s,i)) in allInRange f (0, String.size s) end; 需要一个列表作为其左参数,但对于嵌套列表,它不会给出一个简单的列表作为结果。它会给出!!!作为结果。

您不能再将其用作Either Bool [a]的参数,但您可以轻松 !!!应用于!!! - 包含的列表:< / p>

Either

在这里,我使用monadic绑定运算符>>=将两个可能失败的查找合并为一个,只有当两个查找都成功时才会成功。这相当于两次使用esTerra:: Taulell -> (Int,Int) -> Bool esTerra t (u,d) = case t!!!u >>= (!!!d) of Left e -> False Right p -> True 构造as shown by chi显式展开Either结构。