新增了三个字符串函数,str_starts_with, str_ends_with, str_contains, PHP 的函数这么方便,很难想象竟然一直没有这几个。 str_starts_with 判断字符串是否以另一个字符串开头,在PHP7以及之前 $id = 'inv_abcdefgh'; $result = strpos($id, 'inv_') === 0; var_dump($result); // true PHP8 中可以直接这么写 $result = str_starts_with($id, 'inv_'); str_ends_with 判断字符串是否以另外一个字符串结尾,在 PHP7 及之前,比较麻烦,通常是这么写 $id = 'abcd_inv'; $result = strpos(strrev($id), strrev('_inv')) === 0; 或者 $result = substr($id, -1 * strlen('_inv')) === '_inv'; 或者上正则吧 $result = preg_match('/_inv$/', $id) === 1; 看起来都是比较麻烦的。PHP8 里面可以简化成下面这样了 $id = 'abcd_inv'; $result = str_ends_with($id, '_ind'); str_contains 字符串包含,PHP8 之前一般就是 strpos 来实现了 $url = 'https://example?for=bar'; $result = strpos($url, '?') !== FALSE; PHP8 就直接一点 $result = str_contains($url, '?');
Fold function in haskell
- 获取链接
- X
- 电子邮件
- 其他应用
let’s first take a look at some list functions, and see what’s the characteristic they all share
sum
: computes the sum of the numbers of a structure;and
: returns the conjunction of a container of Bools;map
:map f xs
is the list obtained by applyingf
to each element ofxs
.
There three are all common list function, and act very differently, but can be defined recursively using pattern matching as follow:
mySum :: (Num t) => [t] -> t
mySum [] = 0 -- sum of empty is 0
mySum (x : xs) = x + mySum xs -- otherwise, add first element to sum of rest of the list
myAnd :: [Bool] -> Bool
myAnd [] = True -- and of empty is True
myAnd (x : xs) = x && myAnd xs -- otherwise, return the conjunction of first element and the rest of list
myMap :: (t -> t) -> [t] -> [t]
myMap _ [] = [] -- map any function to empty is empty
myMap f (x : xs) = f x : myMap f xs -- otherwise, prepends f of first element to map f of rest of list
Here we can see the common pattern: Each of them has a binary operator, a starting value (typically the right-identity of the operator), and a list:
- in
sum
function, they are+
, 0 and the list; - in
and
function, they are&&
,True
and the list; - in
map
function, things is a litter complicate, but we can still find them:(\x xs -> (f x):xs)
,[]
and the the list.
In Haskell
, we have a high order function which applied to a binary operator, a starting value (typically the right-identity of the operator), and a list, reduces the list using the binary operator, from right to left:
foldr f z [x1, x2, ..., xn] == x1 `f` (x2 `f` ... (xn `f` z)...)
So we can rewrite sum
, and
and map
use foldr
like this:
mySum' :: (Num t) => [t] -> t
mySum' xs = foldr (+) 0 xs
myAnd' :: [Bool] -> Bool
myAnd' xs = foldr (&&) True xs
myMap' :: (t -> t) -> [t] -> [t]
myMap' xs = foldr (\x xs -> (f x):xs) [] xs
It’s way much easier for us to understand.
That’s all for today, happy coding!
此博客中的热门博文
JavaScript 数据类型
类型 JavaScript 语言的每个值都属于一种数据类型。JavaScript 语言规定了7中类型: Undefined Null Boolean String Number Symbol (ES6开始加入) Object Undefined, Null Undefined 表示未定义,有一个值 undefined。任何变量在赋值是 Undefined 类型,值为 undefined。一般我们可以用全局变量 undefined 表示这个值,或者 void 运算符将任意表达式变成 undefined。undefined 是一个变量而非关键字,为了避免被无意中篡改,建议使用 void 0 来获取 undefined 值。 Null 表示“定义了但为空”,与 Undefined 有一定的表义差别。Null类型只有一个值 null,它是语言关键字,在任何代码中都可以使用 null 来获得 null 值。 实际代码中,不要将变量赋值为 undefined,这样可保证所有值为 undefined 的变量,都是从来未赋值状态。 Boolean Boolean 类型有两个值,true 和 false,表示真和假,均为语言关键字。 String String 表示文本数据,最大长度为 2 53 - 1。 String 的意义并非“字符串”,而是字符串的 UTF-16 编码,字符串的最大长度,受编码长度影响。 JavaScript 字符串是不可变量,构造之后没有任何方法变更内容,具有值类型的特征。 JavaScript 将每个 UTF-16 单元作为一个字符,处理非 BMP(超出 U+000 ~ U+FFF范围)字符是,需要格外小心。 Number Number 类型有 18437736874454810627(即 2 64 - 2 53 +3)个值,基本符合 IEEE 754-2008 规定的双精度浮点数规则,除了一下例外: NaN,占用 9007199254740990,这是原来符合 IEEE 规则的数字 Infinity,无穷大 -Infinity,负无穷大 JavaScript中,+0 和 -0 在加法中无差别,在除法中有差别。1/+0 、1/-0 分别得到 Infinity 和 -Infinity。 ...
Lambda structure
Function $$\lambda x.x$$ is a simple function. It has a head, which is a lambda ($\lambda$) followed by a variable name, and a body, and the head and body of the function is separated by a dot ($.$). When we applied this function to an argument, the x in the body will have the value of that given argument. Alpha equivalence $$\lambda x.x$$ $$\lambda y.y$$ $$\lambda z.z$$ all there three are the same thing. The letters here are not meaningful, just a way of expression. This equivalence is called alpha equivalence. Beta reduction Beta reduction is the process in which we apply a function to arguments, substitute the input expression for all bound variables in the body, and eliminate the head. If we apply $\lambda x.x$ to a number, for example 42, we can substitute 42 for each $x$ in the body, and eliminate the head: $$(\lambda x.x) 42$$ $$42$$ Another example: apply function $(\lambda x.x*4)$ to 8, we got $$(\lambda x.x*4) 8$$ $$8*4$$ $$32$$ We can apply function to another funct...
Java学习笔记 —— 给Map排序
Map接口包含一个称为Map.Entry的公共、静态、内部接口,该接口表示键值对。 Map.entrySet方法返回一组Map.Entry元素。 在Java 8之前,给map排序时主要使用接口中的getKey和getValue方法。 Java8 中,增加了下表中的静态方法。 方法 描述 comparingByKey(Comparator<? super K> cmp) Returns a comparator that comparesMap.Entryby key using the givenComparator comparingByValue() Returns a comparator that comparesMap.Entryin natural order on value comparingByValue(Comparator<?superV>cmp) ReturnsacomparatorthatcomparesMap.Entryby value using the givenComparator 下面用计算字典中单词长度和数量映射,来说明怎么使用这些方法。 Unix系统在 /usr/share/dict/words 目录中包含一个文件,保存了Webster第二版词典的内容。 我们用 Files.lines方法读取文件行并生成包含这些行的字符串流。 System.out.println("\nNumber of words of each length:"); try (Stream<String> lines = Files.lines(dictionary)) { lines.filter(s -> s.length() > 20) .collect(Collectors.groupingBy( String::length, Collectors.counting())) .forEach((len, num) -> System.out.printf("%d: %d%n", len, num)); } catch (IOException e) {...
评论