我试图实现这个功能
every :: (a -> IO Bool) -> [a] -> IO Bool
Run Code Online (Sandbox Code Playgroud)
这是这个问题的主题.我没有明确的递归尝试这样做.我想出了以下代码
every f xs = liftM (all id) $ sequence $ map f xs
Run Code Online (Sandbox Code Playgroud)
我的功能不起作用,因为它不是懒惰的(问题中需要),所以没有赞成在那里:-).
但是,我并没有就此止步.我试图使功能无点,以便它更短(甚至更冷).由于参数f和xs在我刚把他们表达了最后的:
every = liftM (all id) $ sequence $ map
Run Code Online (Sandbox Code Playgroud)
但是这没有按预期工作,事实上它根本不起作用:
[1 of 1] Compiling Main ( stk.hs, interpreted )
stk.hs:53:42:
Couldn't match expected type `[m a]'
against inferred type `(a1 -> b) -> [a1] -> [b]'
In the second argument of `($)', … 我有一些谓词,例如:
is_divisible_by_13 = lambda i: i % 13 == 0
is_palindrome = lambda x: str(x) == str(x)[::-1]
Run Code Online (Sandbox Code Playgroud)
并希望在逻辑上将它们组合在一起,如:
filter(lambda x: is_divisible_by_13(x) and is_palindrome(x), range(1000,10000))
Run Code Online (Sandbox Code Playgroud)
现在的问题是:这种组合可以用无点样式编写,例如:
filter(is_divisible_by_13 and is_palindrome, range(1000,10000))
Run Code Online (Sandbox Code Playgroud)
这当然不具有期望的效果,因为λ函数的真值是True和and并且or是短路运算符.我想出的最接近的事情是定义一个类P,它是一个简单的谓词容器,它实现__call__()并拥有方法and_()并or_()组合谓词.定义P如下:
import copy
class P(object):
def __init__(self, predicate):
self.pred = predicate
def __call__(self, obj):
return self.pred(obj)
def __copy_pred(self):
return copy.copy(self.pred)
def and_(self, predicate):
pred = self.__copy_pred()
self.pred = lambda x: pred(x) and predicate(x) …Run Code Online (Sandbox Code Playgroud) 我编写了这段代码,我必须将其重写为pointfree样式:
num_of_occ ele list = length(filter(==ele)list)
Run Code Online (Sandbox Code Playgroud)
所以我这样做了:
num_of_occ ele = length . filter((==)ele)
Run Code Online (Sandbox Code Playgroud)
有用.比我这样做:
num_of_occ = length . filter . (==)
Run Code Online (Sandbox Code Playgroud)
它没有...我的想法有什么不对?
假设我们有这个无点函数:
f1 = flip const map
Run Code Online (Sandbox Code Playgroud)
我对它究竟是如何工作以及它应该做什么一无所知?即我知道map,const和flip函数是什么.但是把这些放在一起对我来说没有意义.这个功能究竟发生了什么?它似乎返回了我每次传递给它的同样的东西,但是......为什么?
我目前正在阅读" 了解你是一个很好的Haskell",我在第85页上看到了"无点样式 " 的概念,如下所示.但是,fn功能充满了积分!这让我很困惑.
为什么这种写作风格在点满时会被称为"无点" ?
我该如何理解这个概念?"无点"在什么意义上?
"无点风格"一词来自哪里?也许来自一个用空间表示功能组成的语言?
PS:到目前为止,这是这本优秀书中唯一令人困惑的部分(即到目前为止我读过的前85页).

你能解释一下表达式的含义((.).(.))吗?据我所知(.)有类型(b - > c) - >(a - > b) - > a - > c.
玩无点风格的 javascript以获得乐趣.
假设我正在编写视频游戏"暗黑破坏神",我正在使用像这样的复杂嵌套类型对敌人进行建模,但更深入,更复杂:
{ name: "badguy1", stats: { health: 10: strength: 42 }, pos: {x: 100, y: 101 } }
Run Code Online (Sandbox Code Playgroud)
所以我列出了我所有的敌人.我想对某个半径范围内的所有敌人造成伤害
function isInRange(radius, point) { return point.x^2 + point.y^2 >= radius^2; }
function fireDamage(health) { return health - 10; }
var newEnemies = enemies.filter(isInRange).map(fireDamage);
Run Code Online (Sandbox Code Playgroud)
这当然不是类型检查 - 我的组合器采用原语,所以我需要映射和过滤"另一个级别".我不想模糊过滤器/地图业务逻辑管道.我知道镜头可以帮助我,但我可以说我在浏览器中,因为这对于可变结构来说当然是微不足道的.我该怎么做?
我正在学习无点函数,并试图以该样式实现这个递归的空删除器.
工作,但不是免费的:
function removeNulls(obj) {
return R.ifElse(
R.either(R.is(Array), R.is(Object)),
R.pipe(
R.filter(R.pipe(R.isNil, R.not)),
R.map(removeNulls)
),
R.identity
)(obj)
}
module.exports = removeNulls
Run Code Online (Sandbox Code Playgroud)
以下是我对此无效的尝试:
const removeNulls = R.ifElse(
R.either(R.is(Array), R.is(Object)),
R.pipe(
R.filter(R.pipe(R.isNil, R.not)),
// throws `ReferenceError: removeNulls is not defined`
R.map(removeNulls)
),
R.identity
)
Run Code Online (Sandbox Code Playgroud) javascript recursion functional-programming pointfree ramda.js
您好如何在编写方法时强制执行GHC 类似函数Data.Text.read或=~运算符的类型Text.Regex.Posix?
例:
a=["1.22","3.33","5.55"]
没有点免费:
b= map (\x-> read x ::Double) a
如何read使用无点表示法强制执行类型?
b=map read::Double a 或
b= map (read . f1 .f2 .f3... . fn )::Double a (构成方法时)
,其中f1 , f2 ...fn一些方法
或者更好的是,read当它属于一系列方法时,如何指定类型,但不是在链的末尾!:
b=map (f2 . read . f1 ) a
pointfree ×10
haskell ×7
javascript ×2
coding-style ×1
combinators ×1
const ×1
currying ×1
flip ×1
fork ×1
map ×1
predicate ×1
python ×1
ramda.js ×1
recursion ×1
types ×1