1

我有一个关于 Haskell 的问题。我是新手,所以我不太了解,但是如果有人可以帮助我,我将不胜感激。我从我买的一本书中得到了这个练习。

使用值构造器SimNao创建类型Question。创建一个函数:

  • listQuest:从参数接收问题列表,并为Nao返回0 ,或为Sim返回1 ,对应列表中的构造函数。

我试过这段代码:

module Question where 

data Question = Yes | No deriving Show

questNum :: Question -> Int
questNum No = 0
questNum Yes = 1

listQuest :: [Question] -> [Int]
listQuest listQuestion =  [ questNum quest | quest <- listQuestion ]

我迷失在迅速的事情中。不知道写什么来使用这个功能。

谢谢您的帮助

4

1 回答 1

1

有几种方法可以做到这一点,你通过列表​​理解来做到这一点,另一种方法是使用 map:

listQuest :: [Question] -> [Int]
listQuest xs = map questNum  xs

更短

listQuest :: [Question] -> [Int]
listQuest  = map questNum  

使用 foldr (这也是一种说 map 的方式,确实可以使用 foldr 编写通用地图):

listQuest :: [Question] -> [Int]
listQuest = foldr (\x rs -> questNum x : rs) []

和旧的良好模式匹配(是地图,但有模式匹配):

listQuest :: [Question] -> [Int]
listQuest []  = []
listQuest (x:xs) = questNum x : listQuest xs  

你的方式,所有这一切,都是等价的。

在提示上:

然后在提示符下键入如下内容:

$> :l file_name.hs
$> listQuest [Yes, Yes, No]
$> [1,1,0]
于 2019-09-19T18:05:09.493 回答