gpt4 book ai didi

haskell - 试图理解 haskell 库融合效果中的类型

转载 作者:行者123 更新时间:2023-12-02 08:00:13 25 4
gpt4 key购买 nike

我正在尝试理解 hmap。

module Main where

import Control.Effect.Fresh
import Control.Effect.Carrier

a :: Fresh Maybe Int
a = Fresh (\n -> Just 5)

b :: Fresh Maybe [Int]
b = fmap (\n -> [7::Int]) a

f :: Maybe Int -> [] Int
f mi = [1]

c :: Fresh Maybe Int -> Fresh [] Int
c = hmap f


main :: IO ()
main = do
putStrLn "Just testing types"

ghc 错误:

• Couldn't match type ‘x’ with ‘Int’
‘x’ is a rigid type variable bound by
a type expected by the context:
forall x. Maybe x -> [x]
at src/Main.hs:16:5-10
Expected type: Maybe x -> [x]
Actual type: Maybe Int -> [Int]
• In the first argument of ‘hmap’, namely ‘f’
In the expression: hmap f
In an equation for ‘c’: c = hmap f
|
16 | c = hmap f
| ^

为什么没有 x 与 Int 的匹配?hmap 的类型签名是:

hmap :: Functor m => (forall x . m x -> n x) -> (h m a -> h n a)

我的 f 函数在我的代码中声明为:

f :: Maybe Int -> [] Int
f mi = [1]

为什么 m x -> n xMaybe Int -> [] Int 不匹配/p>

最佳答案

hmap 的签名可以看出,它需要一个类型为forall x 的函数。 m x -> n x。那里的 forall x 意味着它需要为所有可能的 x 工作,但你的函数只适用于 Int。它的类型为 m Int -> n Int(其中 m=Mayben=[]),但是 hmap 要求 m x -> n x 用于所有可能的 x

为了将 fhmap 一起使用,您需要以通用方式定义它,例如它适用于任何参数类型

f :: forall x. Maybe x -> [] x
f (Just x) = [x]
f Nothing = []

(注意:forall x. 在此签名中不是必需的,但我包含它是为了说明 f 需要如何匹配 hmap< 的第一个参数)

关于haskell - 试图理解 haskell 库融合效果中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58276032/

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