gpt4 book ai didi

haskell - 如何避免功能重复(IO 和非 IO 版本)

转载 作者:行者123 更新时间:2023-12-03 13:18:26 29 4
gpt4 key购买 nike

我有两个功能:

trans_table :: [Char] -> [Char] -> Map.Map Char Char
trans_table s1 s2 = Map.fromList (zip s1 s2)

random_trans_table :: IO (Map.Map Char Char)
random_trans_table = do
rawKey <- shuffle ascii
let zipped = zip ascii rawKey
let map = Map.fromList zipped
return map

首先他们从两个字符串创建 Map;第二个生成随机 map 。
第一个返回 Map.Map Char Char;第二个返回 IO (Map.Map Char Char)

现在我需要从这个 Map 中查找值,并且我创建了两个函数 - 一个用于 IO Map,另一个用于 Map:
translate_char :: Map.Map Char Char -> Char -> Maybe Char
translate_char table c = Map.lookup c table

translate_char_io :: IO (Map.Map Char Char) -> Char -> IO (Maybe Char)
translate_char_io table c = do
raw_table <- table
let result = Map.lookup c raw_table
return result

我不喜欢它,因为它会导致代码重复。我已经复制了一个函数,如果我用这种方式编码,我将需要复制我的所有函数。

有没有一种方法可以创建与 Map 和 IO (Map) 一起使用的函数?

最佳答案

do -符号,或“绑定(bind)”运算符>>=它会脱糖,为您解决这个问题。

任何您可以调用 translate_char_io 的地方,您可以通过让 monad 语法为您打开表来调用纯函数。例如,如果你想创建一个随机表并在其中查找两个不同的字符,你可以这样做:

test c1 c2 = do
table <- random_trans_table
return (translate_char table c1, translate_char table c2)

关于haskell - 如何避免功能重复(IO 和非 IO 版本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13171694/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com