Haskell对查找调用的返回值进行操作
我有以下代码(使用Haskell前奏曲中的查找):Haskell对查找调用的返回值进行操作,haskell,Haskell,我有以下代码(使用Haskell前奏曲中的查找): 问题是我试图对编译器不允许的可能Int和Int执行加法。如何解决此问题?如果先决条件是查找始终成功,请使用fromJust::也许a->a解析值-例如,fromJust(lookup c al) 否则,如果查找失败,您将需要返回一些“默认”值(例如0)。然后,您可以使用fromMaybe::a->Maybe a->a,它将默认值作为第一个参数并解析该值-例如,fromMaybe 0(lookup c a1)如果前提是查找始终成功,则使用from
问题是我试图对编译器不允许的
可能Int
和Int
执行加法。如何解决此问题?如果先决条件是查找始终成功,请使用fromJust::也许a->a
解析值-例如,fromJust(lookup c al)
否则,如果查找失败,您将需要返回一些“默认”值(例如
0
)。然后,您可以使用fromMaybe::a->Maybe a->a
,它将默认值作为第一个参数并解析该值-例如,fromMaybe 0(lookup c a1)
如果前提是查找始终成功,则使用fromJust::Maybe a->a
解析该值-例如,fromJust(查找c al)
否则,如果查找失败,您将需要返回一些“默认”值(例如
0
)。然后,您可以使用fromaybe::a->Maybe a->a
,它将默认值作为第一个参数并解析该值-例如,在这种情况下,fromaybe 0(查找c1)
,,因为您将值添加在一起,并且很自然地忽略任何值(即将它们视为0
),您还可以使用mappaye
编写函数:
import Data.Maybe (mapMaybe)
al :: [(Char, Int)]
al = [('A', 1), ('B', 2), ('C', 3)]
strToInt :: String -> Int
strToInt = sum . mapMaybe (`lookup` al)
GHCi:
在这种情况下,由于您将值添加到一起,并且忽略任何值(即将它们视为0
)是很自然的,因此您也可以使用mappaye
编写函数:
import Data.Maybe (mapMaybe)
al :: [(Char, Int)]
al = [('A', 1), ('B', 2), ('C', 3)]
strToInt :: String -> Int
strToInt = sum . mapMaybe (`lookup` al)
GHCi:
我想你必须控制自己的逻辑。当您提供的字符返回Nothing
时,不知道您想要什么,此函数最好返回类型
如果您想将Nothing
s视为0
,那么mappaye
就是一种方法。或者,如果您想要可能
键入结果,则
al :: [(Char, Int)]
al = [('A', 1), ('B', 2), ('C', 3), ('D', 4)]
strToInt :: [(Char, Int)] -> String -> Maybe Int
strToInt ts cs = foldr (\c m -> (+) <$> (lookup c ts) <*> m) (Just 0) cs
*Main> strToInt al "AJN"
Nothing
*Main> strToInt al "ABCD"
Just 10
al::[(字符,Int)]
al=[('A',1),('B',2),('C',3),('D',4)]
stroint::[(字符,Int)]->字符串->可能是Int
stroint ts cs=foldr(\c m->(+)(查找c ts)m)(仅0)cs
*Main>strToInt al“AJN”
没有什么
*Main>stroint al“ABCD”
只有10个
我想你必须控制自己的逻辑。当您提供的字符返回Nothing
时,不知道您想要什么,此函数最好返回类型
如果您想将Nothing
s视为0
,那么mappaye
就是一种方法。或者,如果您想要可能
键入结果,则
al :: [(Char, Int)]
al = [('A', 1), ('B', 2), ('C', 3), ('D', 4)]
strToInt :: [(Char, Int)] -> String -> Maybe Int
strToInt ts cs = foldr (\c m -> (+) <$> (lookup c ts) <*> m) (Just 0) cs
*Main> strToInt al "AJN"
Nothing
*Main> strToInt al "ABCD"
Just 10
al::[(字符,Int)]
al=[('A',1),('B',2),('C',3),('D',4)]
stroint::[(字符,Int)]->字符串->可能是Int
stroint ts cs=foldr(\c m->(+)(查找c ts)m)(仅0)cs
*Main>strToInt al“AJN”
没有什么
*Main>stroint al“ABCD”
只有10个
如果字符串包含在a1
中未出现的字符,您认为会发生什么?如果字符串包含在a1
中未出现的字符,您认为会发生什么?这并不是仅有的两种可能性:它们可能希望通过传播无任何内容(+)查找c1 stroint cs
。这并不是唯一的两种可能性:它们可能希望通过(+)查找c1 stroint cs
传播无内容。