理解Haskell函数

时间:2016-09-19 16:44:39

标签: haskell

我想知道(answers entry)totnChars entry = myLoop (answers entry)的用法是什么。这是否意味着条目必须是answers类型?但不是entry类型的Entryt

type Question = [Char]
type Answer = [Char]
type Music = [Char]
data Entryt = MyEntry {
                       questions :: [Question],
                       answers :: [Answer],
                       music :: Music,
                       time :: Float
                      } deriving (Show, Eq) 



totnChars :: Entryt -> Int
totnChars entry = myLoop (answers entry)

myLoop :: [Answer] -> Int
myLoop [] = 0 
myLoop (x:rest) = (nChars x 0) + (myLoop rest)

2 个答案:

答案 0 :(得分:5)

answers是一个getter函数,用于检索给定的条目答案列表,因此totnChars entry = myLoop (answers entry)定义了一个函数,该函数接受一个条目并将myLoop应用于该条目的答案列表。

  

这是否意味着条目必须是类型答案?

没有。说某事必须属于给定类型的语法是expression :: Type,但answers不是类型。类型名称始终以Haskell中的大写字母开头。您可以引入一个名为answers变量类型,但没有任何意义。这绝对不是这里发生的事情。 answers entry只是一个普通的旧函数应用程序。

  

但是不是Entryt类型的输入吗?

是的,是的。

答案 1 :(得分:3)

answers没有类型[Answer]。它的类型为Entryt -> [Answer]

“但为什么?”你可能会问。

每个Entryt都有自己的答案列表,这些答案可能会从Entryt变为另一个answers。因此,Entryt是一个函数,它接受def self.search(search) Collection.includes(posts: :tags).where(tags: {name: search}) end 并返回其答案列表。