我是初学者,我希望有人帮我理解几行代码
我的问题是:
也许String是构造函数Maybe的应用程序,类型为String。 这是什么意思? C语言中有什么相同的东西吗?
这是一个有三个参数的函数吗?
type T = [Char]
type P = (Char, Maybe String)
type Delta = ((Maybe Char, Char), Maybe String)
fromGtoM :: T -> [P] -> [Delta]
这是上述功能的用法吗?
fromGtoM t p = terminalRules ++ varRules
我不明白为什么函数有三个参数但只有
使用了两个:t
,p
。
++
是什么意思?
抱歉,发布了太多问题。
提前致谢。
答案 0 :(得分:5)
我会尝试回答你的问题,但你最好还是读书/找教程。
Maybe String
是一种类型,表示可能 String
,或者可能是Nothing
。在C中,这是种类就像有一个字符串,但是改为给出null
- 除了在Haskell中,信息被放入类型中,如果你省略了{{1} },您将不被允许使用Maybe
。 Wikibooks有更好的解释。Nothing
s(字符串)的列表,第二个参数是Char
和Char
的2元组列表。最后一个“参数”实际上是返回类型。查看currying以获取更多信息。Maybe String
和terminalRules
的类型)。就此而言,您的定义中甚至没有使用varRules
和t
;取而代之的是p
和terminalRules
。varRules
是列表并置运算符。答案 1 :(得分:5)
您已收到其他问题的正确答案,但我认为您的第一个问题尚未得到全面解答。
类型构造函数对于其他编程语言来说是相对陌生的。 C ++中的模板化类型有点类似,但它们变得更加笨拙。此外,模板化类型不具有表现力。类型构造函数完全是一流的。您可以在类型构造函数中创建将应用于其他值的多态类型,以及应用于类型构造函数的值的多态。
data Maybe a = Nothing
| Just a
这大约是标准库中Maybe的定义。它有两个值构造函数。第一个Nothing
没有参数。第二个Just
采用与应用Maybe
相同类型的单个参数。在haskell中,小写类型始终是类型变量。因此a
定义中的Just a
表示“在此上下文中称为a的类型”。在该上下文中,a
被定义为数据类型的参数,因为它也出现在数据定义中的=
之前。
Haskell的类型系统的一部分在这里很有趣。虽然Maybe
本身是一种有效类型,但它不是可以具有值的类型。拥有值不是正确的类型。这是一个名为types的概念的一部分,我不会在这里深入讨论,但最终有助于理解Haskell代码。
现在,让我们看一个稍微复杂的例子,展示不同类型的多态性之间的区别。
data DumbExample1 a = DumbExample1 (Maybe a) [a]
data DumbExample2 f = DumbExample2 (f Int) (f String)
上述愚蠢的例子是新的多态数据类型的定义。每个类型都定义一个带有值构造函数的类型,其名称与类型相同 - DumbExample1
和DumbExample2
。两个值构造函数都有两个参数,主要是为了更好地说明它们。
-- v1 is an example of the polymorphism you can do with templates in C++
-- v1 is a DumbExample1 with the type variable a set to String
v1 :: DumbExample1 String
-- v1 is constructed with the Maybe field containing a string
-- and the list containing two more
v1 = DumbExample1 (Just "foo") ["bar", "baz"]
-- v2 is an example of the polymorphism you cannot easily do with templates in C++
-- (it might be possible to do something equivalent, but it would look a lot clumsier
-- v2 is a DumbExample2 with the type variable f set to Maybe
v2 :: DumExample2 Maybe
-- v2 is construced with the first field containing Just 5, and the second field not
-- containing any String at all
v2 = DumbExample2 (Just 5) Nothing
到目前为止,Haskell的类型系统是它的最佳功能。这只是几乎没有触及它能做什么的表面。但我希望这能让你有点了解为什么我对你的第一个问题的回答基本上是“这不是任何主流语言的概念”。当你进一步深入Haskell时,你会发现类型构造函数的多态性被大量用于创建表达类型。
(它甚至用于那么可怕的语言结构 - 但实际上很简单,需要一段时间才能相信它的全部内容 - Monad。不要担心Monads。它们更简单,更不重要比你想象的更多。如果这个词吓到你,请忽略这个括号内注释。)
答案 2 :(得分:3)
1)也许是说你不一定需要它的方式。你可能有Nothing
,或者你可能有Just
的东西。 Haskell是一种类型语言,因此它不会与C 100%相关。在C中你可以有一个char * P = null,但null实际上不是一个字符串。在Haskell中,这会抛出一个错误,因为如果你说String,它会期待一个String。请查看此处了解更多详细信息:http://haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Maybe.html
2)fromGtoM
是一个带有两个参数的函数。第一个参数是类型T
,第二个参数是类型[P]
(或P
的列表)。然后该函数返回[Delta]
类型的某些内容(或Delta
的列表)。 T
是Char
的列表,P
是包含Char和Just
字符串或Nothing
的元组。最后,Delta是一个包含另一个元组和一个Maybe String的元组。内部元组包含Maybe Char和Char。因此,您可以使用((Nothing, 'a'), Just 'bcd')
类似满足Delta类型的内容。
3)这是函数用法的定义。如果您使用两个变量fromGtoM
和t
来致电p
,则会terminalRules
与varRules
连接。脱离背景,很难说它是如何被使用的。
4)++是列表并置运算符,因此terminalRules
和varRules
是列表,但是fromGtoM只返回一个列表。以下是可能在以后派上用场的运营商列表。 http://www.imada.sdu.dk/~rolf/Edu/DM22/F06/haskell-operatorer.pdf