为了了解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)]
如果这是正确的,有人可以帮我理解这些陈述的类型/功能:
even x = x 'mod' 1 == 1
chart x y = [y| x <- [1..x]]
答案 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
上的反引号,而不是引号。
编辑:
您似乎还希望澄清函数even
和chart
的含义。
即使x是将x除以1时的余数是1还是
不幸的是,函数编写错误,因为所有整数都可以被1
整除,其余部分永远不会1
。 even
的正确定义是
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报告中已有很好的描述,所以我不会在这里留下一个。