我想知道为什么ocaml从右到左评估调用,是FP原则还是根本不重要FP语言?
快速举例:
let rec qs = function
| [] -> []
| h::t -> let l, r = List.partition ((>) h) t in
List.iter (fun e -> print_int e; print_char ' ') l; Printf.printf " <<%d>> " h;
List.iter (fun e -> print_int e; print_char ' ') r; print_char '\n';
(qs l)@(h::qs r)
Run Code Online (Sandbox Code Playgroud)
在我的例子中,(qs r)首先评估调用,然后(qs l)我预计它将是另外的.
# qs [5;43;1;10;2];;
1 2 <<5>> 43 10
10 <<43>>
<<10>>
<<1>> 2
<<2>>
- : int list = [1; …Run Code Online (Sandbox Code Playgroud) 我的任务是实现这些功能,但我先陷入困境.
为什么我不能这样写empty?(ghci抱怨:couldn't match type)
我不是说那[]应该是type m k v吗?
class MapLike m where
empty :: m k v
empty = [] :: m k v
lookup :: Ord k => k -> m k v -> Maybe v
newtype ListMap k v = ListMap { getListMap :: [(k,v)] } deriving (Eq,Show)
Run Code Online (Sandbox Code Playgroud) 我不知道我不能像这样定义bin_tree:
type 'a bin_tree = Node of { data : 'a ; left : 'a bin_tree; right : 'a bin_tree; } | Leaf
Run Code Online (Sandbox Code Playgroud)
Merlin告诉我:内部错误,期待_
到目前为止只有编译错误:
groupElems :: Eq a => [a] -> [[a]]
groupElems [] = []
groupElems (x:xs) =
let (a,b) = span (<= x) xs
in a : (groupElems b)
Run Code Online (Sandbox Code Playgroud)
谢谢.
错误:
Could not deduce (Ord a) arising from a use of ‘<=’
from the context (Eq a)
bound by the type signature for groupElems :: Eq a => [a] -> [[a]]
Run Code Online (Sandbox Code Playgroud)