gpt4 book ai didi

haskell - 类型同义词在函数中展开?

转载 作者:行者123 更新时间:2023-12-03 12:29:39 25 4
gpt4 key购买 nike

西蒙·马洛 (Simon Marlow) 的阅读书“Parallel and Concurrent Programming in Haskell” 我遇到了一件事情,我不确定它为什么像 GHC 看到的那样工作。即:

evalPair :: Strategy a -> Strategy b -> Strategy (a,b)
evalPair sa sb (a,b) = do
a' <- sa a
b' <- sb b
return (a',b')

在类型级别有两个输入参数(我看到的方式 Strategy aStrategy b)和一个输出 - Strategy (a,b) .
但是行下面有三个参数: sa , sb(a,b) .这令人困惑。

但由于 Strategy是类型同义词:
type Strategy a = a -> Eval a

我想也许如果我将 Strategies 展开到 (a -> Eval a) 会更清楚。所以:
evalPair :: (a -> Eval a) -> (b -> Eval b) -> (a,b) -> Eval (a,b)

和(最后加括号)
evalPair :: (a -> Eval a) -> (b -> Eval b) -> ((a,b) -> Eval (a,b))

两者都编译。

然后我就这样写了,感谢 Stack tooltips 发现从函数 evalPair 返回的(故意回到 Strategy 让它更困惑)不是 Strategy (a,b) 但是 Eval (a,b) .
evalPair :: Strategy a -> Strategy b -> Strategy (a,b)
evalPair sa sb (a,b) =
let res = do
a' <- sa a
b' <- sb b
return (a', b')
in res

很明显,编译器从它的类型同义词中解开了最后一个参数,但只是最后一个——因为我们不需要为 Strategy a 提供值。
Strategy b
以下是我的问题:
  • 我在哪里可以获得有关编译器这种行为的更多信息?为什么函数返回 Eval a即使它说它返回 Strategy a
  • 如果解包发生,那么为什么我不需要(实际上也不能)提供 Strategy a 的值和 Strategy b像这样:
    evalPair :: Strategy a -> Strategy b -> Strategy (a,b)
    evalPair a sa a sb (a,b) = do
    a' <- sa a
    b' <- sb b
    return (a',b')
  • 最佳答案

    鉴于类型同义词

    type Strategy a = a -> Eval a

    和类型
    Strategy a -> Strategy b -> Strategy (a,b)

    我们可以通过用定义替换同义词的每次使用来“脱糖”类型:
    (a -> Eval a) -> (b -> Eval b) -> ((a,b) -> Eval (a,b))

    请注意,这里有必要使用括号来阐明正在发生的事情。函数 evalPair仍然需要两个参数。它的两个参数是两个函数。如果我在视觉上将类型与其相应的参数对齐,这可能会更清楚,如下所示:
    evalPair :: (a -> Eval a) -> (b -> Eval b) -> (a,b) -> Eval (a,b)
    evalPair sa sb (a,b) = ...

    因此 sa的类型是 a -> Eval a ,以及 sb 的类型是 b -> Eval b .

    请注意,Haskell 报告指出:

    Type synonyms are a convenient, but strictly syntactic, mechanism to make type signatures more readable. A synonym and its definition are completely interchangeable



    因此,编译器可以自由地“包装”或“解开”类型同义词,因为它们“完全可以互换”。

    您可以在 Haskell 报告的 4.2.2 节中阅读有关类型同义词的信息:
    https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-730004.2.2

    关于haskell - 类型同义词在函数中展开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52572836/

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