【发布时间】:2014-08-24 06:30:40
【问题描述】:
这里绝对是 Haskell 初学者。不太确定我在做什么。
我想创建和初始化一个配对列表,然后对它们执行某些功能。我可以这样做:
type Btype = (Char,Bool)
svar :: Char -> [Btype] -> Bool
svar x [] = False
svar x ((a,b):xs) = if (x == a) then b
else svar x xs
bt = [('a', True), ('b', True), ('c', False), ('d', True), ('e', False)]
这可以工作并且做我想要的,只是不是我想要的方式。
要使用此功能,我需要输入:
svar 'a' bt
我得到 True,它是标签“a”的值,所以它可以工作。
然而,我想要的是能够以某种方式初始化列表 bt,以便我可以以某种方式修改函数签名
(svar :: Char -> [Btype] -> Bool)
所以我不必输入:
svar 'a' bt
但只需输入
svar 'a'
并得到相同的结果。
我玩弄了 data 关键字并尝试了函数的变体,但没有运气。我似乎无法摆脱我的“程序员逻辑”并尝试从函数式编程的角度思考,这也无济于事。所以,在这里度过了一段艰难的时光。
非常感谢任何提示/提示/解决方案。谢谢。
【问题讨论】:
-
svar函数应该如何知道要查看哪个列表? -
另外请注意,您基本上是在重写
lookup,它的签名非常相似。 -
很明显该函数需要列表才能工作(记住haskell是纯粹的)所以你可以做这样的事情的唯一方法就是逃到一些monad - 你可以隐藏的State/Reader-Monad你在 IO 中的价值或去 IO 并做你以前在 other 语言中做的所有事情:P
-
您是否需要
svar来使用您在问题中所写的列表bt以外的列表?如果没有,您可以使用 where 子句或 let 绑定将bt包含在svar的定义中。 -
具体来说,您可以像这样实现 Keshav Kini 的建议:
svar2 x = svar x bt,这将创建一个新函数svar2,其行为与您描述的一样。
标签: haskell