Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 数据类型从母亲(祖母)到母亲_Haskell_Types_Maybe - Fatal编程技术网

Haskell 数据类型从母亲(祖母)到母亲

Haskell 数据类型从母亲(祖母)到母亲,haskell,types,maybe,Haskell,Types,Maybe,假设我有一个数据类型Person data Person = Person String Person 二,。人应该是母亲 showGrandmother :: Person -> Maybe Person showGrandmother (Person _ mother) = Just mother 将只显示x人的母亲。 如何显示祖母?首先,您的数据定义缺少基本大小写。假设这表示,我将以Eve作为基本情况 data Person = Eve | Person String Perso

假设我有一个数据类型
Person

data Person = Person String Person
二,。人应该是母亲

showGrandmother :: Person -> Maybe Person
showGrandmother (Person _ mother) = Just mother
将只显示x人的母亲。
如何显示祖母?

首先,您的数据定义缺少基本大小写。假设这表示,我将以
Eve
作为基本情况

data Person = Eve | Person String Person deriving (Show)
定义母函数

mother Eve = Nothing
mother (Person _ m) = Just m
现在祖母用了两次

grandmother = \x -> mother x >>= mother
使用Control.Monad-Kleiski操作符,可以很好地编写这篇文章

grandmother = mother >=> mother

首先,您的数据定义缺少基本情况。假设这表示,我将以
Eve
作为基本情况

data Person = Eve | Person String Person deriving (Show)
定义母函数

mother Eve = Nothing
mother (Person _ m) = Just m
现在祖母用了两次

grandmother = \x -> mother x >>= mother
使用Control.Monad-Kleiski操作符,可以很好地编写这篇文章

grandmother = mother >=> mother

通过模式匹配,您不局限于一个级别的构造函数,您可以嵌套它们以进一步“在”:


顺便说一句,我不是Haskell专家,但对于家谱模型来说,数据类型似乎有点循环。如果不引用另一个人,则无法实际创建一个人。也许更好的办法是

data Person = Person String (Maybe Person)
。。。在这种情况下,找到祖母可以像

showGrandmother :: Person -> Maybe Person
showGrandmother (Person _ Just (Person _ (Just grandmother)))) = Just grandmother
showGrandmother _                                              = Nothing
。。。确保在没有祖母的情况下处理基本情况。你原来的类型不需要处理这个案件,因为根据它,每个人都必须有一个祖母


从中汲取灵感,我们有可能找到一个人的母亲

showMother :: Person -> Maybe Person
showMother (Person _ (Just mother)) = Just mother
showMother _                        = Nothing
。。。使用
可能是一个单子的事实,可以如下使用它

showGrandmother :: Person -> Maybe Person
showGrandmother x = showMother x >>= showMother

我怀疑理解上面的一元代码将超出这个特定问题的范围。

通过模式匹配,您不局限于一个级别的构造函数,您可以将它们嵌套到“in”中:


顺便说一句,我不是Haskell专家,但对于家谱模型来说,数据类型似乎有点循环。如果不引用另一个人,则无法实际创建一个人。也许更好的办法是

data Person = Person String (Maybe Person)
。。。在这种情况下,找到祖母可以像

showGrandmother :: Person -> Maybe Person
showGrandmother (Person _ Just (Person _ (Just grandmother)))) = Just grandmother
showGrandmother _                                              = Nothing
。。。确保在没有祖母的情况下处理基本情况。你原来的类型不需要处理这个案件,因为根据它,每个人都必须有一个祖母


从中汲取灵感,我们有可能找到一个人的母亲

showMother :: Person -> Maybe Person
showMother (Person _ (Just mother)) = Just mother
showMother _                        = Nothing
。。。使用
可能是一个单子的事实,可以如下使用它

showGrandmother :: Person -> Maybe Person
showGrandmother x = showMother x >>= showMother

我怀疑理解上述一元代码超出了这个问题的范围。

老实说,我不理解那个代码。我需要如何修改我的函数(showGrander)才能正常工作?@R.Mayer请尝试将“我不理解该代码”转换为可以回答的问题。(什么是你很难理解的?你在阅读代码的过程中遇到了什么困难?)至于“我需要如何修改我的函数”,那么,让我们说,在理解这里写的答案之后,答案会非常快。命名约定的补充说明。您的方法不是
show
方法。返回值不是
String
表示,而是实际的
Person
值,因此将其命名为
showX
有误导性……老实说,我不理解该代码。我需要如何修改我的函数(showGrander)才能正常工作?@R.Mayer请尝试将“我不理解该代码”转换为可以回答的问题。(什么是你很难理解的?你在阅读代码的过程中遇到了什么困难?)至于“我需要如何修改我的函数”,那么,让我们说,在理解这里写的答案之后,答案会非常快。命名约定的补充说明。您的方法不是
show
方法。返回值不是
String
表示,而是实际的
Person
值,因此将其命名为
showX
会产生误导。。。