我有以下结构:
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
答案 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
结构。