2012-02-21 70 views
0

我试图做一些事情,以便它需要一本书和一个字符串,然后返回与书中字符串相关联的值...所以我到目前为止是:Haskell - 通过对列表搜索

data Answer = T | F 
    deriving (Eq, Show, Ord) 

type Book = [(String, Answer)] 

testBook :: Book 
testBook = [("aT", T), ("bF", F)] 

,我想这样做,这样让我们说我把:

test testBook "aT" 

^答案就出来T.

我做类似:

test::Book->String->Answer 
test a b = [x | (y, x) <- a, y == b] 

但我知道这是完全关闭..我怎么能比较字符串与书中的内容?看起来很简单,但Haskell的语法很难适应。

+7

请不要“编辑”您的问题。 StackOverflow的全部概念是,在浏览网站时,具有相同问题的其他人可以找到问题和给出的答案。 – shang 2012-02-21 05:39:53

+0

回滚编辑。 – dflemstr 2012-02-21 11:24:11

回答

2

您的代码是正确的。现在,您可以获得的答案列表,不管b的值为。你需要添加一个条件来检查元组的第一项是否等于b;要做到这一点,你必须给它一个名字,而不是使用_

您可以通过使用一个逗号和表达式添加条件列表理解:

[x | x <- a, x > 10] 

将让你所有的值从大于10 a,例如。

我会让你弄清楚如何把我的建议放在一起。

+0

这很有帮助。现在我正在尝试: test :: Book-> String->答案 test a b = [x | (y,x)< - a,y == b] 这对我来说似乎是正确的..但我仍然收到错误。我的代码(对我来说)似乎是我返回x,如果参数中的字符串等于该对中的第一个元素 – user1189352 2012-02-21 04:36:13

+0

编辑OP到现在的位置 – user1189352 2012-02-21 04:36:40

+0

列表理解总是返回*列表*。所以你要回答一个答案列表,而不仅仅是一个。 – 2012-02-21 04:38:27

3

使用“查找”功能(可在Prelude中找到)。

+0

ty会调查它 – user1189352 2012-02-21 04:37:28

+0

查找功能是你如何在现实生活中做到这一点,但是当你学习Haskell时自己实现它是很好的。 – 2012-02-21 04:39:15

+0

@TikhonJelvis:是的,没有。我同意重塑小轮子对于熟悉Haskell是很好的,但是Haskell有很多内建的库函数只是乞求使用... – 2012-02-21 04:54:37