gpt4 book ai didi

haskell - 应用运算符 <* 和 *>,类型签名暗示

转载 作者:行者123 更新时间:2023-12-04 18:11:18 26 4
gpt4 key购买 nike

我最近看到一个简单的例子,它带来了 <**>点亮。

validate :: String -> Maybe String
validate s = if s=="" then Nothing else Just s

>validate "a" *> validate "b"
Just "b"
>validate "" *> validate "b"
Nothing
>validate "a" <* validate "b"
Just "a"
>validate "a" <* validate ""
Nothing
>validate "a" <* validate "b" <* validate "c"
Just "a"
>validate "a" *> validate "b" <* validate "c"
Just "b"
这表明效果很重要,即使它们产生的值不重要。
我的问题是关于类型签名。
(*>) :: f a -> f b -> f b
(<*) :: f a -> f b -> f a
  • 这些类型签名是否真的暗示了上面显示的行为?

  • 我可以看到人们如何推断“显然我们有一个 Applicative - 所以这说明了一般的行为。对于运算符 *> ,因为我们正在丢弃左值,所以这个函数唯一可能的含义是如何左侧的影响会影响整个操作。”
    Maybe 的情况下- 那么似乎是的 - 行为是隐含的。对于 Either ,同样,含义成立,并且错误将在效果“失败”时传播。
    注意我只能说上面的内容,因为我现在知道实现是如何工作的,我的问题与第一次看到这样的签名的经验丰富的函数式程序员有关。
    我已经读过像 [a] -> b :: Int 这样的类型签名(可能不是真正的代码)只是暗示实现作为列表的长度。
    我还搜索了“从类型签名暗示实现”,发现人们已经/正在做这些事情 - 但一般来说无法完成(呃 - 没有那个新的 GitHub 事情 :--)
    所以也许我已经回答了我自己的问题,但如果有任何其他答案或评论,我将不胜感激。我对 Haskell 还是很陌生,在经历了多年的错误开始之后,它终于开始深入人心了。我只是触及了表面......
    谢谢

    最佳答案

    (*>) :: f a -> f b -> f b
    (<*) :: f a -> f b -> f a

    Do these type signatures actually imply the behavior shown above?


    当然不是。这两个操作可以简单地实现为
    apR :: (Applicative f) => f a -> f b -> f b
    apR a b = b

    apL :: (Applicative f) => f a -> f b -> f a
    apL a b = a
    忽略 Applicativef 的约束.
    以同样的方式 [a] -> Int并不意味着实现是 length .它也可以是
    foo :: [a] -> Int
    foo _ = 42
    但是在这两种情况下,这些都不是“正确”的实现,因为推断的类型与给定的签名不同。
    那么,您的问题可能有点不同,例如,假设有一个具有匹配推断类型的实现。这是否意味着它做了我们想要做的事情?
    答案似乎仍然是否定的。一方面,我们可以定义
    apR2 :: (Applicative f) => f a -> f b -> f b
    apR2 a b = pure (\a _ b -> b) <*> a <*> b <*> b
    对于某些类型,例如您的示例,它不会有所作为。但总的来说,做两次效果与只做一次是不同的。
    另一个更有意义的“错误”实现(感谢 Daniel Wagner 的评论)是
    apR2b :: (Applicative f) => f a -> f b -> f b
    apR2b a b = pure (\b a -> b) <*> b <*> a
    现在,即使您的示例也不总是有效,因为效果的顺序不同——它“确实” b的第一个,在 a 之前的。

    关于haskell - 应用运算符 <* 和 *>,类型签名暗示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70305153/

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