所以我对这整个函数式编程交易都不熟悉.在我最近学习Haskell的冒险中,我遇到了一个奇怪的问题.我知道GHC交互环境允许所谓的"懒惰"评估,这意味着只在需要它们的值时才评估Haskell表达式.这听起来像是一个非常有用的行为,因为它可以帮助简化优化过程.我的下一个逻辑思路是:那么当Haskell编译成机器代码时会发生什么?你是否失去了懒惰?它变成了"命令式"代码吗?
有没有办法使用列表推导编写Haskell过滤器函数的实现?
一个错误不断出现,我很难理解如何处理它.这就是我所拥有的:
filter' :: (a -> Bool) -> [a] -> [a]
filter' _ [] = []
filter' f xs = [f x | x <- xs]
Run Code Online (Sandbox Code Playgroud)
任何指导或链接将不胜感激.
haskell functional-programming list-comprehension list filter
我正在处理Sanctuary.js上的文档.我一直在努力学习Haskell,并且在FP概念上有点挣扎.
我理解类型值是一个对象,它具有(a)构造函数(代表类型),(b)类型标识符(作为命名属性的类型名称@@type,以及(c)需要由除了没有任何状态的类型值之外,FP类型值和普通的面向对象对象之间有什么区别?Fantasy-Land规范给出了标准类型来实现,包括它们的方法.一些(全部?)的这些方法遵守代数法则,比如Functors要求一种map遵循身份和组成规律的方法.我可以自由地创建我的用户类型并需要我喜欢的方法吗?这些方法是否必须符合任何代数设计原则或法则?不,它确实看起来像OO设计(减去对象中的状态)给我!我不知道我缺少什么.类似接口吗?父对象?
该保护区的文档支持属性访问值的类型,或只是每个值-关于"通达假"的谈判null和undefined.它表示" Object接近,但Object.create(null)产生一个支持属性访问的值,但它不是Object类型的成员".但是,打印具有创建的对象null显示{},它的typeof存在object.它对我来说似乎是Object类型的成员.我有什么误会?为什么Accessiblepsuedo类型是必要的?伪类型和常规类型有什么区别?Integer例如,被称为伪类,但它似乎是Number我的类的扩展.
我们可以在函数式语言中创建一个带void(即没有返回值)的函数吗?像Haskell或Scheme
我正在尝试使用命令式和功能性概念构建标准ML程序,并将内容写入文件.但我的while循环似乎没有终止,而是连续打印相同的值.
fun writeImage image filename =
let val ap = TextIO.openOut filename
val (w,h) = size image
val row = ref 0
val stringToWrite = "";
in
while !row < h do
TextIO.output(ap,"A");
row := !row + 1;
TextIO.closeOut ap
end;
Run Code Online (Sandbox Code Playgroud)
如果我在while循环之后删除第一行,则循环终止.但如果我包括TextIO.output(ap,"A");,它就没有.为什么会这样?
迭代嵌套列表有很多问题,但是我想迭代嵌套列表并应用另一个列表.
这是我的场景:
def operation(a, b):
return a + b
def magic_function(func, list, nested_list):
"""iterate over nested_list and apply the next element of list"""
...
magic_function(operation, [0, 0, 0, 10, 10, 10], [[1, 2, 3], [1, 2, 3]])
Run Code Online (Sandbox Code Playgroud)
期望的输出:
[[1, 2, 3], [11, 12, 13]]
Run Code Online (Sandbox Code Playgroud)
用numpy回答这个问题的冲动可能很强烈,但在实际情况中,这些是对象,而不是数字.
该标准itertools.chain.from_iterable在此处不起作用,因为它不保留列表的嵌套.
python iterator functional-programming list multidimensional-array
我想转换IO [String]到[String]具有<-约束力.但是,我需要do在一个where声明中使用一个块来做到这一点,但是Haskell一直抱怨缩进.这是代码:
decompEventBlocks :: IO [String] -> IO [[String]]
decompEventBlocks words
| words' /= [] = block : (decompEventBlocks . drop $ (length block) words')
| otherwise = []
where
do
words' <- words
let block = (takeWhile (/="END") words')
Run Code Online (Sandbox Code Playgroud)
这是什么原因?我们如何do在where声明中使用块?而且,我们是否有机会在警卫面前发表一些声明?
我是函数式编程的新手,我正在尝试解决以下练习;
鉴于类型
type Cont r a = (a -> r) -> r
Run Code Online (Sandbox Code Playgroud)
实现以下高阶函数
mapReader :: (a -> b) -> (Cont r a) -> Cont r b
Run Code Online (Sandbox Code Playgroud)
第一步是简化类型,它给出:
mapReader :: (a -> b) -> ((a -> r) -> r) -> (b -> r) -> r
Run Code Online (Sandbox Code Playgroud)
接下来,定义需要在此函数中提供的参数.这些参数是我们得到的三个函数
mapReader :: (a -> b) -> ((a -> r) -> r) -> (b -> r) -> r
mapReader f g h = _1
Run Code Online (Sandbox Code Playgroud)
从这里,我们可以定义以下类型:
f :: a -> b
g :: (a -> r) -> …Run Code Online (Sandbox Code Playgroud) plusOne :: [[(Int, Int, Int)]] -> [[(Int, Int, Int)]]
给出一个3元组列表.如果我想遍历列表并且对Int值进行+1,那么我该如何处理呢?我不确定这是否应该使用地图.
有人能指出我正确的方向吗?
我想定义一个期望的函数,Int根据数字(x)在控制台中输出错误,然后更新Statewith Nothing.
如何在一个函数中加入这些命令?
这是我得到的:
type Env = [(Variable,Int)]
newtype StateError a = StateError { runStateError :: Env -> Maybe (a, Env) }
class Monad m => MonadError m where
throw :: Monad m => a -> m a
instance MonadError StateError where
throw x = StateError (\s -> Nothing)
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何执行IO副作用,然后在同一个函数定义中更新状态