gpt4 book ai didi

Haskell:两次应用多态函数

转载 作者:行者123 更新时间:2023-12-05 00:19:35 26 4
gpt4 key购买 nike

我们可以为不同的 f :: a -> ba 对实现一个多态函数 b 。我们怎样才能使

twice :: (a -> b) -> a -> c
twice f x = f (f x)

类型检查?即如何编写一个应用两次多态函数的函数?

使用 Rank2Types 我们可以更接近一点,但还不够:
{-# LANGUAGE Rank2Types #-}

twice1 :: (forall a. a -> (m a)) -> b -> (m (m b))
twice1 f = f . f

twice2 :: (forall a. m a -> a) -> m (m b) -> b
twice2 f = f . f

所以一些多态函数可以应用两次:
\> twice1 (:[]) 1
[[1]]
\> twice2 head [[1]]
1

我们可以走得更远吗?

The question was asked over Haskell cafe 10 年前,但没有得到很好的回答(使用类型类,它变成了很多样板文件)。

最佳答案

{-# LANGUAGE TypeFamilies, RankNTypes, UnicodeSyntax #-}

type family Fundep a :: *

type instance Fundep Bool = Int
type instance Fundep Int = String
...

twice :: ∀ a . (∀ c . c -> Fundep c) -> a -> Fundep (Fundep a)
twice f = f . f

现在,这实际上没有多大用处,因为您无法定义一个(有意义的)多态函数,它适用于任何 c .一种可能性是加入一个类约束,比如
class Showy a where
type Fundep a :: *
showish :: a -> Fundep a

instance Showy Bool where
type Fundep Bool = Int
showish = fromEnum
instance Showy Int where
type Fundep Int = String
showish = show

twice :: ∀ a b . (Showy a, b ~ Fundep a, Showy b) =>
(∀ c . Showy c => c -> Fundep c) -> a -> Fundep b
twice f = f . f

main = print $ twice showish False

关于Haskell:两次应用多态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35542271/

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