haskell:理解类型和功能

时间:2014-03-26 01:07:15

标签: haskell

为了了解haskell的工作原理,我创建了以下语句。我试图了解他们的类型是什么;如果我是正确的轨道,任何人都可以告诉我吗?

statement                       type
['h', 'e', 'l', 'l', 'o']       ['h', 'e', 'l', 'l', 'o'] :: [char]

[(9,8),(7,6),(5,4)]             [(9,8),(7,6),(5,4)] :: [int a, int b] => [(a,b)] 

如果这是正确的,有人可以帮我理解这些陈述的类型/功能:

  1. even x = x 'mod' 1 == 1

  2. chart x y = [y| x <- [1..x]]

2 个答案:

答案 0 :(得分:5)

您的类型签名不太正确。注意大写,[Char];它是Num而不是int;以及错误的括号:(Num a, Num b) => [(a, b)]。至于其余的......

$ ghci
[...]
Prelude> let even x = x `mod` 1 == 1
Prelude> :t even
even :: Integral a => a -> Bool
Prelude> let chart x y = [y| x <- [1..x]]
Prelude> :t chart
chart :: (Enum t1, Num t1) => t1 -> t -> [t]

另外,请注意mod上的反引号,而不是引号。

评论后

编辑

您似乎还希望澄清函数evenchart的含义。

  

即使x是将x除以1时的余数是1还是

不幸的是,函数编写错误,因为所有整数都可以被1整除,其余部分永远不会1even的正确定义是

even x = x `mod` 2 == 0
  

即使x是x除以2时的余数是否为零

至于chart

  

值x和数字y的图表是一个列表,其中包含从1到x的数字列表中每个元素的值y

所以如果你做chart 3 5,你将会得到[1,2,3,4,5]中每个元素的三分之一列表,所以五个三分之一:[3, 3, 3, 3, 3]

答案 1 :(得分:2)

Haskell中的类型是大写的;是的,这很重要。

['h', 'e', 'l', 'l', 'o'] :: [Char]

正确,虽然[Char]和String是类型同义词,但String看起来更好。 :P

[(9,8),(7,6),(5,4)] :: (Num a, Num b) => [(a,b)]

多个约束在圆括号中。没有“int”类型类。

even x = x `mod` 1 == 1
even :: Integral a => a -> Bool

确保使用反引号,而不是单引号;是的,这很重要。在ghci中使用:t来检查mod的类型和(==),并使用:i来检查Num和Integral之间的关系,你应该能够把它放在一起。

chart x y = [y | x <- [1..x]]
chart :: (Num a, Enum a) => a -> b -> [b]

为此,您必须知道[a..b]的“长名称”是enumFromTo,以及如何减少列表推导。列表理解并不难,但在RWH,LYAH和Haskell 2010报告中已有很好的描述,所以我不会在这里留下一个。