我想创建一个函数来决定字符是Haskell中字母表中的字母
isLetter :: Char -> Bool
Run Code Online (Sandbox Code Playgroud)
因此结果可能如下所示:如果我输入isLetter 'c',结果将是True,如果是isLetter ' ',那么结果就是False.
什么是嵌套模式?我无法理解为什么以下嵌套模式:
exception BadTriple
fun zip3 list_triple =
case list_triple of
([],[],[]) => []
| (hd1::tl1,hd2::tl2,hd3::tl3) => (hd1,hd2,hd3)::zip3(tl1,tl2,tl3)
| _ => raise BadTriple
fun unzip3 lst =
case lst of
[] => ([],[],[])
| (a,b,c)::tl => let val (l1,l2,l3) = unzip3 tl
in
(a::l1,b::l2,c::l3)
end
Run Code Online (Sandbox Code Playgroud)
另外,我无法理解嵌套模式和嵌套case-expression之间有什么不同我可以得到一些关于这些事情的例子吗?
根据我的理解,curried函数应该总是返回一个函数.但是,在下面的代码中,我相信这个函数返回一个列表.但是当我检查类型时,它看起来像一个curried函数.
fun zipWith f xs ys =
case (xs,ys) of
([],_) => []
| (_,[]) => []
| (x::xs',y::ys') => (f(x,y)) :: zipWith f xs' ys'
Run Code Online (Sandbox Code Playgroud)
类型:
val zipWith = fn : ('a * 'b -> 'c) -> 'a list -> 'b list -> 'c list.
Run Code Online (Sandbox Code Playgroud)
有人可以解释这个函数中的类型和currying的工作原理.任何帮助表示赞赏!
所以foldr const 0 "tacos"应该解开成为类似的东西
0 const ('t' const ('a' const ('c' const ('o' const 's')))).
Run Code Online (Sandbox Code Playgroud)
我认为它只会停止,0 const ('t'因为 Haskell 是惰性求值的,而 const 只接受第一个参数。那么,理论上,该函数不会适用于 1 吗?
但这不起作用。替换0为""也不起作用。有谁知道为什么?
谢谢!
我试图围绕 Haskell 进行思考,但在尝试将以下签名实现为函数时遇到了麻烦。你们能给我一个使用 lambda 表达式的例子吗?
(b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)