【问题标题】:haskell: understanding types and functionshaskell:理解类型和函数
【发布时间】:2014-05-04 04:18:48
【问题描述】:

为了了解 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]]

【问题讨论】:

  • 了解类型(=> 右侧和类型类(左侧)之间的区别。并且:即使 Int 是类型类(它不是),它仍然需要大写。
  • @jwize:不,这就是标签的用途。
  • even x = ( (x `mod` 1) == 1 )是不是更清楚了?

标签: haskell


【解决方案1】:

您的类型签名不太正确。注意大小写,是[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 上的反引号,而不是引号。

EDIT 在 cmets 之后:

看来你也想澄清一下evenchart这两个函数的含义。

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]

【讨论】:

  • 是的,很抱歉这是我不使用大写的错误,在第二个语句中我使用了错误类型的括号,另外我承认我没有使用反引号......谢谢你的指点这一点,我很欣赏并理解两者的重要性......
  • 反思你的回答,你为什么在前奏中使用“让”,这是什么意思?谢谢
  • 交互式 Haskell 作为一系列动作运行,因此它的语法与您在 .hs 文件中编写的 Haskell 略有不同。虽然你会在代码中写x = 1,但你需要在ghci 中写let x = 1。更多信息here
  • 我想我明白了,所以这里我有一个函数 add [1,2,3] 2 = [3,4,5] 它接受数字 2 并将其添加到list 给你一个新的列表......所以这意味着类型是一个 nums [Num] 的列表,但是实现这个的方法是什么?我假设它在这里使用咖喱函数是对的吗?感谢您的宝贵时间
  • 其实x的偶数是x除以2的余数是否为的值。
【解决方案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 报告中已经有很好的描述,所以我不会在这里留下。

【讨论】:

  • 谢谢大家...但请帮助我理解这些类型或功能???偶数 x = x 'mod' 1 == 1 图表 x y = [y| x
  • 甚至是一个函数。积分 a => a -> Bool 是一种类型。图表是一个函数。 (Enum a, Num a) => a -> b -> [b] 是一种类型。
  • 啊我想我明白了.....所以这使得 abc 成为 Num 类型的函数...abc [1,2,3] 1 = [6,7,8] .. ..那正确吗?谢谢
  • 那是否也意味着这个语句没有作用...... ['h', 'e', 'l', 'l', 'o'] :: [Char] it只有一个类型???
  • ['h', 'e', 'l', 'l', 'o'] 是“只是”一个值。它是 [Char] 类型的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多