- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这来自Haskell from First Principles一书中的练习。本练习是为 ZipList'
实现 Applicative
,这类似于 Prelude 的 ZipList
。书上有这个提示
Check Prelude for functions that can give you what you need. One starts with the letter
z
, the other with the letterr
. You’re looking for inspiration from these functions, not to be able to directly reuse them as you’re using a customList
type, not thePrelude
provided list type.
我猜测以 z
开头的函数是 zipWith
,但我不知道以 r
开头的函数。
data List a =
Nil
| Cons a (List a)
deriving (Eq, Show)
zipWith' :: (a -> b -> c) -> List a -> List b -> List c
zipWith' _ Nil _ = Nil
zipWith' _ _ Nil = Nil
zipWith' f (Cons x xs) (Cons y ys) = Cons (f x y) (zipWith' f xs ys)
newtype ZipList' a = ZipList' (List a)
deriving (Eq, Show)
instance Functor ZipList' where
fmap f (ZipList' xs) = ZipList' $ fmap f xs
instance Applicative ZipList' where
pure x = ZipList' $ Cons x Nil
(ZipList' fs) <*> (ZipList' xs) = ZipList' $ zipWith' ($) fs xs
这通过了书中的一个测试用例,但我想知道是否有更好的方法来实现它,因为我没有使用以r
开头的函数。我有一种感觉,这应该是重复
,因为它也应该在无限列表上工作。
最佳答案
阅读原始帖子下的线程,我得出一个结论,该帖子的作者试图证明该实现满足法律( fmap f xs = (pure f) <*> xs
):
让我们尝试将其证明为经典恒等式,摆脱包装。因此,让我们用右手工作:
(pure f) <*> xs = (repeat' f) <*> xs = zipWith' ($) (repeat' f) xs
;
就身份而言,证明 zipWith' ($) (repeat' f) xs
等于 fmap f xs
就足够了。
它们相同的原因非常明显:
length (zipWith op xs ys) == min (length xs) (length ys)
; (在 xs
和 ys
均为无限的情况下,无法计算此表达式)。
自 repeat' f
是无限的,length $ zipWith' ($) (repeat' f) xs
事实上,length xs
(在这里,这样的值是否存在实际上并不重要:索引的存在就足够了)。 xs
的每个元素应用于相同的函数 f
,这是重复的。正如您所看到的,大小被保留,并且每个元素都通过常量函数变形,这就是 fmap
的定义。 .
关于haskell - 为自定义 ZipList 实现 Applicative,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58593349/
我正在运行一个 redis 实例,我在其中存储了很多具有整数字段和值的哈希值。具体来说,有很多形式的散列 {1: , 2: , ..., ~10000: } 我最初使用 hash-max-ziplis
基地提供ZipList ,它只是 [] 的包装器在哪里 基于 zip而不是笛卡尔积。这不是默认值,因为它与 Monad [] 不一致。例如,但有些人觉得它更直观,而且这两种行为在不同的情况下都很有用。
我如何编译和执行 Redis ziplist.c作为单独的可执行文件? 我只想执行 ziplist.c 主函数。 最佳答案 您可以使用以下命令: gcc -std=c99 -O2 -DZIPLIST_
此前我们学习了常见的reids数据类型,这些数据类型都需要底层的数据结构的支持,现在我们来看看redis常见的底层数据结构:dict、ziplist、quicklist。 1 redis di
GHC Prelude 中列表的默认 monoid 是串联。 [1,2,3] <> [4,5,6]变成 [1,2,3] ++ [4,5,6]因此[1,2,3,4,5,6] 我想编写一个行为如下的 Zi
我想为我的自定义列表实现一个 Applicative 实例。 import Test.QuickCheck import Test.QuickCheck.Checkers import Test.Qu
这来自Haskell from First Principles一书中的练习。本练习是为 ZipList' 实现 Applicative,这类似于 Prelude 的 ZipList。书上有这个提示
假设我有一个数字列表和函数列表: val xs: List[Int] = List(1, 2, 3) val fs: List[Int => Int] = List(f1, f2, f3) 现在我想使
Typeclassopedia提出这个问题: Determine the correct definition of pure for the ZipList instance of Applicat
我正在从learn-you-a-haskell 书中学习Haskell 中的应用仿函数。 但是每当我尝试在 ghci 中输入以下代码时: :{ instance Applicative ZipList
应用程序的两个著名示例是 monad 和 ziplist。还有其他例子吗? 最佳答案 来自 Time flies like an applicative functor通过康纳麦克布莱德: Struc
我目前正在学习 Haskell 中的应用程序。如果我没记错的话,列表有两个不同的 Applicative 实例(List 和 ZipList - 第二个被定义为包装列表值的新类型)。 ZipList
我的问题示例:HMSET myhash field1 value1 field2 value2 而myhash只有这两个字段。 主要问题是如何计算hash-max-ziplist-value,以便我的
我是一名优秀的程序员,十分优秀!