【问题标题】:Value constructors in haskellhaskell 中的值构造函数
【发布时间】:2019-09-19 16:47:07
【问题描述】:

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

使用值构造函数Sim 或Nao 创建一个类型Question。做一个 功能:

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

我试过这段代码:

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 ]

我迷路了。不知道写什么来使用函数。

感谢您的帮助

【问题讨论】:

  • 那么到底有什么不适合你呢?
  • Haskell 不会在英语和...葡萄牙语之间进行翻译?您必须使用data 声明所定义的Yes 和No。 (或改为data Question = Sim | Nao deriving Show。)
  • 感谢您的回答,但我也遇到了提示问题。我不知道在上面写什么
  • 谢谢,chepner,我没注意
  • @Marrows 请检查我编辑的答案,在问题中添加您的提示问题,并添加详细信息,您可以编辑它

标签: list function haskell question-answering value-constructor


【解决方案1】:

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

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) []

和旧的好的模式匹配(是map,但是有模式匹配):

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

你的方式,以及所有这些,都是等效的。

根据提示:

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

$> :l file_name.hs
$> listQuest [Yes, Yes, No]
$> [1,1,0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多