gpt4 book ai didi

haskell - 自然语言类型的子类型

转载 作者:行者123 更新时间:2023-12-03 14:57:46 25 4
gpt4 key购买 nike

我是一名语言学家,致力于自然语言的形式语法/语义。我已经开始了
最近使用 Haskell,很快我意识到我需要添加子类型。例如给定类型 Human
和动物,
我想让人类作为动物的一个子类型。我发现这可以使用强制函数,其中实例由用户声明,但我不知道如何在我感兴趣的实例中定义强制。所以基本上我不知道在 'coerce = 之后添加什么'让它工作'。这是到目前为止的代码:

{-# OPTIONS

-XMultiParamTypeClasses
-XFlexibleInstances
-XFunctionalDependencies
-XRankNTypes
-XTypeSynonymInstances
-XTypeOperators
#-}

module Model where

import Data.List



data Animal = A|B deriving (Eq,Show,Bounded,Enum)

data Man = C|D|E|K deriving (Eq,Show,Bounded,Enum)

class Subtype a b where
coerce :: a->b

instance Subtype Man Animal where
coerce=




animal:: [Animal]
animal = [minBound..maxBound]

man:: [Man]
man = [minBound..maxBound]

提前致谢

最佳答案

暂时忽略 Subtype 类并检查您正在编写的强制函数的类型。如果 aManbAnimal ,那么您正在编写的强制函数的类型应该是:

coerce :: Man -> Animal

这意味着您所要做的就是编写一个合理的函数来转换您的每一个 Man构造函数(即 C | D | E | K )到相应的 Animal构造函数(即 A | B )。这就是子类型的含义,您可以在其中定义一些将“子”类型映射到原始类型的函数。

当然,您可以想象,因为您的 Man 有四个构造函数。为您的 Animal 键入和只有两个构造函数输入然后你会得到多个 Man构造函数映射到相同的 Animal构造函数。这没有什么问题,它只是意味着强制功能是不可逆的。如果不知道这些构造函数的确切含义,我无法对此发表更多评论。

您的问题的更一般的答案是无法自动知道 Man 中的哪些构造函数。应该映射到 Animal 中的哪些构造函数.这就是为什么你必须编写强制函数来告诉它人与动物之间的关系是什么。

另请注意,“子类型”类和“强制”功能没有什么特别之处。您可以跳过它们并编写一个“manToAnimal”函数。毕竟没有对子类型的内置语言或编译器支持,而子类型只是一些随机人想出的另一个类(坦率地说,子类型并不是真正地道的 Haskell,但你并没有真正问过这个问题) .定义类实例所做的只是允许您重载函数 coerce。在 Man 上工作类型。

我希望这会有所帮助。

关于haskell - 自然语言类型的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com