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