gpt4 book ai didi

haskell - 什么是 haskell 中的自然转换?

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

我想知道,Haskell 中的自然转换是什么。
自然变换用以下签名描述:

F[a] ~> G[a]

例如,我可以转换:
Maybe a ~> List a

正确的?
IO 呢? ,不可能做到自然转化吧?
自然转化的目的是什么?

最佳答案

一个自然的变换,不用深入到它背后的范畴论,实际上只是一个多态函数。

Prelude> :set -XRankNTypes
Prelude> :set -XTypeOperators
Prelude> type (~>) f g = forall x. f x -> g x
~>运算符将一个类型构造函数映射到另一个类型构造函数,这样它就适用于第一个类型构造函数的任何给定参数。 TypeOperator扩展名让我们可以使用 ~>而不是像 NatTrans 这样的名称; RankNTypes是什么让我们使用 forall在定义中以便调用者可以选择哪种类型 fg将应用于。
这是一个来自 Maybe 的自然变换示例至 List ,它需要一个 Maybe a对于任何类型 a , 并生成一个等效列表(通过返回一个空列表或包装值作为单例列表)。
Prelude> :{
Prelude| m2l :: Maybe ~> [] -- Maybe a -> [a]
Prelude| m2l Nothing = []
Prelude| m2l (Just x) = [x]
Prelude| :}
Prelude> m2l Nothing
[]
Prelude> m2l (Just 3)
[3]
Prelude> m2l (Just 'c')
"c"
“逆”将是 l2m :: [] ~> Maybe , 与 l2m [] = Nothingl2m (x:_) = Just x . (我把倒数放在引号中,因为 m2l (l2m [1,2,3]) /= [1,2,3] )
没有什么能阻止您使用 IO作为任一类型构造函数(尽管 IO 在左侧,它也必须在右侧)。
foo :: IO ~> IO
foo a = putStrLn "hi" >> a
然后
> foo (putStrLn "foo")
hi
foo
> foo (return 3)
hi
3
另一个例子是查看 length作为 [] 的自然转换至 Const Int (改编自 https://bartoszmilewski.com/2015/04/07/natural-transformations/ ,我强烈推荐阅读):
-- Isomorphic to builtin length, as Const Int is isomorphic to Int
-- Requires importing Data.Functor.Const
length' :: [] ~> Const Int
length' [] = Const 0
length' (x:xs) = Const (1 + getConst (length' xs))

关于haskell - 什么是 haskell 中的自然转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58363868/

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