gpt4 book ai didi

haskell - 如何将多态函数应用于 Either 的两边?

转载 作者:行者123 更新时间:2023-12-05 01:32:53 26 4
gpt4 key购买 nike

我试过这个:

type TestT = Either Int Float

testM :: (a -> a) -> TestT -> TestT
testM f (Left x) = Left (f x)
testM f (Right x) = Right (f x)

但是还是不行,请问有什么办法吗?我环顾四周,发现类似的一切都非常复杂和有限。

错误信息,根据要求:

Main.hs:101:28: error:
• Couldn't match expected type ‘a’ with actual type ‘Int’
‘a’ is a rigid type variable bound by
the type signature for:
testM :: forall a. (a -> a) -> TestT -> TestT
at Main.hs:100:1-35
• In the first argument of ‘f’, namely ‘x’
In the first argument of ‘Left’, namely ‘(f x)’
In the expression: Left (f x)
• Relevant bindings include
f :: a -> a (bound at Main.hs:101:7)
testM :: (a -> a) -> TestT -> TestT (bound at Main.hs:101:1)

最佳答案

我认为您无法用基础语言做到这一点。如评论中所述,您可能需要启用几个扩展,例如 RankNTypes。

由于所有涉及的类型都是数字类型,因此很容易使用增量函数,例如 (+1) 作为多态函数。

让我们在 ghci 下试试:

$ ghci
GHCi, version 8.6.5: http://www.haskell.org/ghc/ :? for help
λ>
λ> type TestT = Either Int Float
λ>
λ> :set +m
λ>
λ> :set -XRankNTypes
λ> :set -XScopedTypeVariables
λ>
λ> {-
|λ> let { testM :: (forall a. Num a => a -> a) -> TestT -> TestT ;
|λ> testM fn (Left x) = Left (fn x) ;
|λ> testM fn (Right x) = Right (fn x) }
|λ> -}
λ>
λ> :type testM
testM :: (forall a. Num a => a -> a) -> TestT -> TestT
λ>
λ> testM (+3) (Left 42)
Left 45
λ>
λ> testM (+3) (Right 3.14159)
Right 6.14159
λ>

注意 1:如果您省略语言扩展,它会中断,并显示一条提示 RankNTypes 的消息。

注2:如果你使用forall a. Num a => (a -> a) 而不是 (forall a.Num a => a -> a),它也会中断。

注意 3: 这里有一些现有技术:SO-q38298119 Alexis King 的有用评论。

关于haskell - 如何将多态函数应用于 Either 的两边?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65161255/

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