haskell函数中不带参数的where子句

艺电H101
substitute':: (Eq a)=> a -> a -> [a] -> [a]
substitute' x y = map substituteOne
                  where
                    substituteOne x' | x == x'   = y
                                     | otherwise = x'

因此,此函数的要点是,它将接受类型a的两个输入和类型a的列表,并将列表[a]中的所有元素从“第一个” a替换为“第二个” a。至少这就是任务描述所说的。

我已经实现了递归版本,但是还需要带有where子句的函数。

所以这就是解决方案。不知何故我有问题:

  1. 没有任何参数的第二行中的replaceOne如何工作?
  2. 我们在哪里给出列表作为输入?或我们在哪里声明该列表的用途?我的意思是编译和执行它有效,但是不知何故我看不到它
  3. x'是什么?它从来没有在任何地方定义,我们只是以某种方式开始使用它(也许也参考问题1)
  4. map需要一个函数和一个列表,这样它才能工作。这里我们有地图功能_。可能指的是2.,但是replaceOne x'的输出是什么?

如果需要,结果如下所示:

substitute' 5 10 [1, 5, 2, 5, 3, 5]
[1,10,2,10,3,10]
格雷格·培根

(1)substituteOne没有任何参数的第二行如何工作?
(2)我们在哪里给出列表作为输入?或者我们在哪里声明什么,我们做这个列表?我的意思是编译和执行它有效,但是以某种方式我看不到它

参数仍然存在;这是工作中的烦人考虑一下infix运算符的 这一部分(+1),这是部分应用程序的一种特殊情况给定一个数字,它将产生一个更大的数字。见证人:

λ> :t (+1)
(+1) :: Num a => a -> a

我们可以定义一个函数来通过命名列表来增加列表的所有元素

λ> :t \l -> map (+1) l
\l -> map (+1) l :: Num b => [b] -> [b]

但原来是因为不必要的钻营

λ> :t map (+1)
map (+1) :: Num b => [b] -> [b]

毕竟,这是函数式编程。使用Haskell,我们可以像处理其他语言一样轻松地操作函数。

(3)什么x'它从来没有在任何地方定义,我们只是以某种方式开始使用它(也许也参考问题1)

但您确实将定义x'substituteOne的参数

考虑以下类型map

λ> :t map
map :: (a -> b) -> [a] -> [b]

它的第一个参数是一个参数的函数。为了使您的程序能够进行类型检查,类型必须对齐。我们可以substituteOne通过添加一个可选的类型注释来强调这一点-但由于它是一个内部函数,它引用了外部作用域,因此必须更加努力(通过启用作用域类型变量扩展)substituteOne

substitute':: forall a. Eq a => a -> a -> [a] -> [a]
substitute' x y = map substituteOne
                  where
                    substituteOne :: a -> a
                    substituteOne x' | x == x'   = y
                                     | otherwise = x'

(4) map需要一个功能和一个列表,这样它才能起作用。这里我们有map功能_可能指的是2.,但是输出是substituteOne x'多少?

与代码一样,在应用程序点使用未命名的参数map substituteOne称为无点样式在您的情况下,有两个不可见的“点”或变量名:的参数substituteOne和的列表参数map

您可能对所有事情都一目了然,例如

substitute'' :: Eq a => a -> a -> [a] -> [a]
substitute'' x y l = map (\x' -> if x == x' then y else x') l

相比之下,这更加混乱。

由产生的值substituteOne收集在产生的列表中map

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章