gpt4 book ai didi

haskell - 类型运算符的顺序和种类要求

转载 作者:行者123 更新时间:2023-12-02 15:34:22 26 4
gpt4 key购买 nike

玩弄 TypeOperators 我已经尝试实现 $. 这样我就可以去掉我的程序中的任何括号(无意冒犯任何人)那里有美丽的 Lispers)。在这样做时,我同构地复制了定义。首先,我尝试仅使用 $ 因为您不需要 . 及其强大的功能。

{-# LANGUAGE TypeOperators #-}
type f $ a = f a

f :: Int -> IO $ Either String Int
f n = undefined
太棒了。这可以编译,我很满意。

{-# LANGUAGE TypeOperators #-}
type f $ a = f a

f :: Int -> IO $ Maybe $ Either String Int
f n = undefined

这应该有效吗?

TyCo.hs:4:18:
Expecting one more argument to ‘Maybe’
The second argument of ‘$’ should have kind ‘*’,
but ‘Maybe’ has kind ‘* -> *’
In the type signature for ‘f’:
f :: Int -> (IO $ Maybe) $ Either String Int

显然不是。

{-# LANGUAGE TypeOperators #-}
type f $ a = f a
type (f * g) a = f (g a)

f :: Int -> IO * Maybe $ Either String Int
f n = undefined

带着盲目的希望,我尝试着。

TyCo.hs:5:6:
Type synonym ‘*’ should have 3 arguments, but has been given 2
In the type signature for ‘f’:
f :: Int -> (IO * Maybe) $ Either String In

在我无知的昏迷中,我提出了一个问题:为什么它不起作用?

最佳答案

第一个问题与$的固定性有关,您可以通过注意括号的位置来看到错误消息中的符号。 (IO $ Maybe) 是部分应用的类型同义词,导致错误。您不能部分应用类型同义词,因为它需要比较它们,这相当于比较函数。

LiberalTypeSynonyms 只是让 GHC 在进行类型检查之前解包类型同义词,即 (IO * Maybe) $ Either String Int 变为 (IO (也许 (Either String Int))) 然后然后它进行类型检查。这意味着 * 不再部分应用,并且程序可以编译。

关于haskell - 类型运算符的顺序和种类要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29138320/

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