Questions tagged «functional-programming»

函数式编程是一种基于使用函数构建抽象,避免副作用和状态改变的编程范例。纯函数式编程是线程安全的。

3
函数编程中的“部分功能”到底是什么意思?
根据我的理解,部分函数是通过向函数传递比预期少的参数而获得的函数。例如,如果这在Python中直接有效: >>> def add(x,y): ... return x+y ... >>> new_function = add(1) >>> new_function(2) 3 在上面的代码段中,new_function是部分功能。但是,根据Haskell Wiki,部分函数的定义为 局部函数是未针对指定类型的所有可能参数定义的函数。 因此,我的问题是:“部分函数”到底是什么意思?

2
处理递归和类型时如何减少代码重复
我目前正在为一种编程语言开发一个简单的解释器,并且我的数据类型如下: data Expr = Variable String | Number Int | Add [Expr] | Sub Expr Expr 我有许多函数可以执行简单的操作,例如: -- Substitute a value for a variable substituteName :: String -> Int -> Expr -> Expr substituteName name newValue = go where go (Variable x) | x == name = Number newValue go …

2
Haskell:Typeclass与传递函数
在我看来,您总是可以传递函数参数,而不是使用类型类。例如,而不是定义相等类型类: class Eq a where (==) :: a -> a -> Bool 并在其他函数中使用它来指示类型实参必须是的实例Eq: elem :: (Eq a) => a -> [a] -> Bool 我们是否elem可以不使用类型类就定义函数,而是传递可以完成工作的函数参数?


1
van Laarhoven是否表示“可选”
许多类型的光学元件都具有van Laarhoven表示。 例如,Lens类型的a Lens s t a b 可以表示为: Functor f => (a -> f b) -> s -> f t 类似地Traversal,可以用类似的方式表示,将Functor约束交换为Applicative: Applicative f => (a -> f b) -> s -> f t 几种光学框架(例如Monocle和Arrow)定义了一种类型Optional。 在《单片眼镜光学》中,层次结构 Optional介于Lens和之间Traversal 根据我的理解:如果Traversal是像一个Lens可能具有零到多个目标,那么Optional就像是一个Lens可能具有零到一的目标。 在Monocle中,Optional定义为一对功能: getOrModify :: s -> Either t a set :: (b, s) …

3
折叠后无需后处理步骤,是否可以实现此文字功能?
《真实世界》 Haskell,印刷版的第98页第4章询问是否words可以使用折叠实现,这也是我的问题: 可能吗?如果没有,为什么?如果是,怎么办? 我基于以下想法提出了以下想法:每个非空格都应该放在输出列表中的最后一个单词之前(这发生在otherwise防护中),并且空格应该触发将空值单词附加到输出列表,如果没有一个已经(这是在处理if- - )。thenelse myWords :: String -> [String] myWords = foldr step [[]] where step x yss@(y:ys) | x == ' ' = if y == "" then yss else "":yss | otherwise = (x:y):ys 显然,此解决方案是错误的,因为输入字符串中的前导空格会导致输出字符串列表中的一个前导空字符串。 在上面的链接中,我研究了为其他读者准备的几种解决方案,其中许多解决方案与我的解决方案相似,但是它们通常对折页的输出进行“后处理”,例如通过折叠tail处理是一个空的前导字符串。 其他方法使用元组(实际上仅是成对的),以便对折处理成对的并可以很好地处理前导/尾随空间。 在所有这些方法中,foldr(或另一种折衷方式)并不是开箱即用地提供最终输出的功能。总有其他东西必须以某种方式调整输出。 因此,我回到最初的问题,询问是否实际上可以words使用折叠实现(以某种方式正确处理尾随/前导/重复的空格)。通过使用折叠,我的意思是折叠功能必须是最外面的功能: myWords :: String -> [String] myWords input …

1
如何解释Scala Cats / fs2中的堆栈安全性?
这是fs2文档中的一段代码。该函数go是递归的。问题是我们如何知道它是否是堆栈安全的,以及如何推断任何函数是否是堆栈安全的? import fs2._ // import fs2._ def tk[F[_],O](n: Long): Pipe[F,O,O] = { def go(s: Stream[F,O], n: Long): Pull[F,O,Unit] = { s.pull.uncons.flatMap { case Some((hd,tl)) => hd.size match { case m if m <= n => Pull.output(hd) >> go(tl, n - m) case m => Pull.output(hd.take(n.toInt)) >> Pull.done } case None …

2
清理Java8中的数据列表
为了清理数据列表,我创建了一种方法,该方法接受数据列表和要执行的清理操作列表。 public <T> List<T> cleanData(List<T> data, List<Function<T, T>> cleanOps) { List<T>dataNew=data.stream().map((str) -> { T cleanData = str; for(Function<T,T> function:cleanOps) { cleanData=function.apply(cleanData); } return cleanData; }).collect(Collectors.toList()); return dataNew; } 这里的问题是,当Collectors.toList()返回新列表时,我们将再次创建整个列表。我们可以在不使用额外空间的情况下达到相同的结果吗? 下面是调用代码: public void processData() { List<Function<String, String>> cleanOps = new ArrayList<>(); cleanOps.add(String::toLowerCase); cleanOps.add(str -> str.replaceAll(" ", "")); List<String> data = new …

5
为什么println被认为是不纯函数?
我正在阅读Scala中的编程书籍,据说: ...在这种情况下,其副作用是打印到标准输出流。 而且我看不到副作用在哪里,因为对于相同的输入,println会在每次 调用时输出相同的输出(我认为) UPDATE,例如: println(5) 它会打印5,我看不到调用println(5)将打印5以外的其他值的情况!

2
如何为Piped ES6函数生成JSDoc
我有一个ES6样式的函数,该函数是使用组成的asyncPipe。 import { getItemAsync } from 'expo-secure-store'; const asyncPipe = (...fns) => x => fns.reduce(async (y, f) => f(await y), x); const getToken = () => getItemAsync('token'); const liftedGetToken = async ({ ...rest }) => ({ token: await getToken(), ...rest, }); const liftedFetch = ({ body, route, token, method = …

1
Haskells弱头范式
我偶然发现了一些令人讨厌的东西。我知道haskell可用于弱头正常形式(WHNF),而且我知道这是什么。将以下代码键入ghci(据我所知,我正在使用命令:sprint,将表达式简化为WHNF): let intlist = [[1,2],[2,3]] :sprint intlist 给intlist = _这使得完全意义的我。 let stringlist = ["hi","there"] :sprint stringlist 给stringlist = [_,_] 这已经使我感到困惑。但是之后: let charlist = [['h','i'], ['t','h','e','r','e']] :sprint charlist 令人惊讶地给 charlist = ["hi","there"] 据我了解,Haskell,字符串不过是字符列表,这似乎可以通过检查类型"hi" :: [Char]和来确认['h','i'] :: [Char]。 我感到困惑,因为根据我的理解,以上所有三个示例大致相同(列表列表),因此应简化为相同的WHNF,即_。我想念什么? 谢谢

6
在POJO中复制公共属性的获取者/设置者的方法
我们有一个自动生成的POJO,具有约60个属性。这是通过avro 1.4生成的,其中不包括getter / setter。 我们用来在对象之间提供简单转换的库需要使用类似于getter / setter的方法才能正常工作。 有没有一种方法可以复制获取器/设置器,而不必手动覆盖POJO并手动创建所有获取器/设置器? public class BigGeneratedPojo { public String firstField; public int secondField; ... public ComplexObject nthField; } public class OtherObject { private String reprOfFirstFieldFromOtherObject; private ComplexObject reprOfFirstFieldFromOtherObject; public String getReprOfFirstFieldFromOtherObject() { ... standard impl ... }; public void setReprOfFirstFieldFromOtherObject() { ... standard impl ... …

1
用cont无法完成的callCC我该怎么办?
我真的很难理解callCC。我拥有Continuations的力量,并且在我的一些项目中一直在使用该概念来创建很酷的概念。但是我从来没有必要使用功能比cont :: ((a->r)->r)-> Cont r a。 在使用它之后,很有意义,为什么他们将Cont Monad称为所有Monad的母亲,是的,我不知道何时需要使用callCC,这正是我的问题。

2
是否应该使用效果类型来建模有状态对象?
当使用像Scala和的功能环境时cats-effect,是否应该使用效果类型来建模有状态对象的构造? // not a value/case class class Service(s: name) def withoutEffect(name: String): Service = new Service(name) def withEffect[F: Sync](name: String): F[Service] = F.delay { new Service(name) } 构造不是容易犯错的,因此我们可以使用较弱的typeclass,例如Apply。 // never throws def withWeakEffect[F: Applicative](name: String): F[Service] = new Service(name).pure[F] 我想所有这些都是纯粹的和确定性的。只是不是参照透明的,因为每次生成的实例都是不同的。那是使用效果类型的好时机吗?还是这里会有不同的功能模式?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.