gpt4 book ai didi

haskell - 如何派生 Haskell 记录字段的类型?

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

来自 OOP,这对我来说似乎是外星代码。

我不明白为什么 runIdentity 的类型是一个函数:
runIdentity :: Identity a -> a ?我指定为 runIdentity :: a

newtype Identity a = Identity {runIdentity :: a} deriving Show

instance Monad Identity where
return = Identity
Identity x >>= k = k x

instance Functor Identity where
fmap f (Identity x) = Identity (f x)

instance Applicative Identity where
pure = Identity
Identity f <*> Identity v = Identity (f v)

wrapNsucc :: Integer -> Identity Integer
wrapNsucc = Identity . succ

调用 runIdentity :

runIdentity $ wrapNsucc 5 -- gives 6 as output

最佳答案

你说得对runIdentity只是 a 类型的简单字段.但是 runIdentity 的类型是 Identity a -> a , 自 runIdentity是从 Identity a 中提取该字段的函数.您无法获取 runIdentity毕竟,没有提供从哪个值中获取它的值。

编辑:
为了在评论中扩展一点 OOP 类比,想想一个类

class Identity<T> {
public T runIdentity;
}

这是 Identity monad,松散地转换为 OOP 代码。模板参数 T基本上是你的 a ;因此, runIdentityT 类型.得到那个 T从你的对象,你可能会做类似的事情

Identity<int> foo = new Identity<int>();
int x = foo.runIdentity;

你看 runIdentity作为 T 类型的东西,但事实并非如此。你不能只做

int x = runIdentity; // Nope!

因为 - 从哪里获得 runIdentity从?相反,想想这就像做

Identity<int> foo = new Identity<int>();
int x = runIdentity(foo);

这显示了当您调用成员时实际发生的情况;你有一个函数(你的 runIdentity )并为其提供一个要使用的对象 - IIRC 这就是 Python 对 def func(self) 所做的事情.所以不是简单的类型 T , runIdentity实际上正在服用 Identity<T>作为返回 T 的参数.

因此,它的类型为 Identity a -> a .

关于haskell - 如何派生 Haskell 记录字段的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46022615/

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