【发布时间】:2021-12-13 07:39:47
【问题描述】:
感谢热心的互联网人抽出宝贵时间。
我正在尝试实现一个类型为 Int -> (a, Int, [Int]) 的 Monad,我需要能够从 Monad 中提取每个值。
目前我正在尝试实现、fmap、return、get 和 put。问题是我不知道如何从 Int -> (a, Int, [Int]) 类型中检索值。
monad 的类型定义为newtype M a = M { run :: Int -> (a, Int, [Int]) }
其中第一个 int 是开始计算的值(如 Collatz 序列),a 是结果,Int 在tuple 是最终状态(如果执行 Collatz 序列,它将以 1 结束),Ints 列表是导致最终状态的所有计算的日志(IE 是: [5, 16, 8, 4, 2, 1] 如果开始的 int 是 5)
到目前为止,我已经找到了检索元组中值的方法
newtype M a = M { run :: Int -> (a, Int, [Int]) }
getVals :: M a -> Int -> a
getVals m z = a where
(a, _, _) = run m z
getState :: M a -> Int -> Int
getState m z = mid where
(_, mid, _) = run m z
getLog :: M a -> Int -> [Int]
getLog m z = ws where
(_, _, ws) = run m z
(z 应该是计算的初始整数值:例如 collatz 序列)
但我无法从 Int -> (a, Int, [Int]) 中检索到初始的 Int
只是为了澄清我在询问如何从 Int -> (a, Int, [Int]) 类型中检索个人详细信息。 Monad 的东西只是上下文。
【问题讨论】:
-
我并不完全清楚你想要你的类型的语义是什么。如果您编辑您的问题以使其更清晰(最好还添加一些示例),那么我可以更新我的答案以包括如何实现更多类型类和方法。
-
舌尖在脸颊上:
getInitialInput :: M a -> Int -> Int; getInitialInput m z = z。但只是轻微的;如果这不能满足您的需求,那么可能值得考虑一下具体原因。 -
您似乎想从函数
A -> B中提取A类型的值。为什么你认为这是可能的?如果我去市场看到“1 公斤苹果 1 欧元”的标语,我无法从该交易中获得 1 欧元。 -
你确定你想要一个单子吗?如果您只想要 Collatz 序列,那么您可以为它编写一个递归函数,而无需使用 monad。或者,如果您愿意,可以使用
unfold。
标签: haskell functional-programming