【发布时间】:2023-03-16 03:49:01
【问题描述】:
我目前正在学习 Haskell,我很难理解如何解释 <$> 和 <*> 的行为。
在某些情况下,这一切都来自搜索如何在使用takeWhile 时使用or 操作,而我找到的答案是这个
takeWhile ((||) <$> isDigit <*> (=='.'))
在我看到的大多数文档中,<*> 与容器类型一起使用。
show <*> Maybe 10
通过观察
(<$>) :: Functor f => (a -> b) -> f a -> f b
它告诉我 保留外部容器,如果它的内容,并将权利应用于内部,然后将其包装回容器中
a b f a f b
([Int] -> String) -> [Just]([Int]) -> [Just]([String])
这对我来说很有意义,在我看来 f a 本质上是在容器内发生的,但是当我尝试相同的逻辑时,我可以理解,但我无法关联逻辑
f = (+) <$> (read)
所以f 变成了
a b f a f b
([Int] -> [Int -> Int]) -> ([String] -> [Int]) -> ([String] -> [Int -> Int])
所以f 是容器,当我尝试弄清楚这段代码将要做什么时,我真的很困惑。我明白当我这样写出来时,我可以计算出来,它基本上等同于.
(.) :: (b -> c) -> (a -> b) -> a -> c
b c a b a c
([Int] -> [Int -> Int]) -> ([String] -> [Int]) -> ([String] -> [Int -> Int])
所以可以写成
f = (+) . read
为什么不就这么写呢?为什么原来的sn-p不直接写成
takeWhile ((||) . isDigit <*> (=='.'))
或者<$> 在这种情况下是否暗示了. 没有的东西?
现在看<*>,好像和基本一模一样,只是它需要两个容器,使用两个容器的内部,然后把它装进容器中
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
所以
Just show <*> Just 10
f a b f a f b
[Just]([Int->Int]->[Int]) -> [Just]([Int->Int]) -> [Just]([Int])
但是,对于函数,事物如何相互传递变得模糊不清。 查看原始片段并将其分解
f1 :: Char -> Bool -> Bool
f1 = (||) . isDigit
f2 :: Char -> Bool
f2 = f1 <*> (== '.')
f2 中的<*> 行为是
f a b f a f b
([Char] -> [Bool] -> [Bool]) -> ([Char] -> [Bool]) -> ([Char] -> [Bool])
所以使用之前的逻辑,我认为Char -> 是容器,但在了解正在发生的事情时它对我来说不是很有用。
在我看来<*> 将函数参数传递到右侧,然后传递相同的函数参数,并将返回值传递到左侧?
所以对我来说,它看起来相当于
f2 :: Char -> Bool
f2 x = f1 x (x=='_')
当我看到<*> 和<$> 时,我想弄清楚数据在哪里流动,这对我来说是一种心理体操。我想我只是在寻找一个有经验的haskell-er如何在他们的脑海中阅读这些操作。
【问题讨论】:
-
之间的区别。和 stackoverflow.com/questions/27883414/… 还可以阅读 typeclassopedia wiki.haskell.org/Typeclassopedia中的函子和应用部分@
-
在函数上,
.和<$>之间没有区别。至于体操,在弄清楚为什么会这样之后,你只需记住(f <*> g) x = f x $ g x。还有(h <$> f <*> g) x = (liftA2 h f g) x = f x `h` g x = (h . f) x (g x)。 -
只是一个评论。对于每个 Applicative 函子,以下表达式
f <$> x <*> y等价于liftA2 f x y。事实证明,函数实例的liftA2非常方便,值得学习。本质上是liftA2 c f g ==\x -> c (f x) (g x)。例如(||) <$> isDigit <*> (=='.') == liftA2 (||) isDigit (== '.') == \x -> isDigit x || x == '.' -
函数是一个容器。它包含由参数索引的值。
-
@Ammar “差异 [in that link]”是指“no 差异 [as shown in that link]”。
标签: haskell