gpt4 book ai didi

Monad 和 SML 模块

转载 作者:行者123 更新时间:2023-12-05 03:06:40 25 4
gpt4 key购买 nike

signature MAPPABLE = sig
type 'a mappable
val fmap : ('a -> 'b) -> 'a mappable -> 'b mappable
end

structure Option : MAPPABLE = struct
type 'a mappable = 'a option
fun fmap f v =
case v of
(SOME x) => SOME (f x)
| NONE => NONE;
end

structure List : MAPPABLE = struct
type 'a mappable = 'a list
fun fmap f v = map f v
end


fun incByFive x = x + 5

真的只是为了有一个函数来处理 fmap

fun mapToPair f x =
let val b = List.fmap f x
in (b,b)
end

val lst = mapToPair incByFive [1,2,3];

假设你想做一个通用的实现,适用于MAPPABLE 的所有实例。以下不起作用

fun mapToPair f x =
let val b = MAPPABLE.fmap f x
in (b,b)
end

看来,如果需要的话,SML 人员会指向 Functors。我尝试实现一个,用于 mapToPair 的通用实现

functor FMAPFUNCTOR (structure Q : MAPPABLE)
= struct
fun mapToPair f x =
let val b = Q.fmap f x
in (b,b)
end
end;

然而,为了将它与 Haskell 中的东西一起使用,我称之为仿函数例如,我需要实例化仿函数(这让我想起了 C++出于某种原因的模板)

structure MAPPABLE_TO_PAIR = FMAPFUNCTOR (structure Q = List);
val lstByPoly = MAPPABLE_TO_PAIR.mapToPair incByFive [1,2,3]

我将不得不为每个 MAPPABLE 重复该实例化我想使用的实例。我想 Haskell 会执行类似这样的操作,也。只是含蓄地。

现在我想知道是否有更好的“用户”的捷径/糖我错过了 SML 中的体验”。因为真的,它看起来很友善为了在代码中使用它,有很多样板文件基地。

最佳答案

I guess Haskell performs something like this, too. Just implicitly.

Haskell 标准库定义并导入了大量类型类实例。给定一组足够的 ML 仿函数、它们的应用程序和它们的隐式编译时导入,您可以实现一些非常方便的事情。

但 Haskell 确实允许您以 SML 不支持的方式自动执行类型类实例声明。

例如,instance Foo t => Bar t where ... 可与 SML 的高阶仿函数相媲美,但在 SML 中,您必须明确生成一个对应于 Bar 的模块t 代表每个具体的 Foo t。 Haskell 还可以让你 derive instances句法上。

OCaml 有 modular implicits从 2014 年开始(example),但它们主要为您提供语法糖来引用定义的仿函数实例,而不是生成它们。

我怀疑 ML 模块系统仍然比 Haskell 更明确的原因是因为像 overlapping instances 这样的事情。 .

Andreas Rossberg 贡献了 1ML 2014 年,其中模块是一等公民。这意味着一个函数可以将一个模块作为参数,例如喜欢this :

;; Higher-kinded polymorphism

type MONAD (m : type => type) =
{
return 'a : a -> m a;
bind 'a 'b : m a -> (a -> m b) -> m b;
};

map 'a 'b (m : type => type) (M : MONAD m) (f : a -> b) mx =
M.bind mx (fun x => M.return (f x));

do map :
'a => 'b => (m : type => type) => (M : MONAD m) => (a -> b) -> m a -> m b;

从编译器名称中有“TOY”的意义上说,这仍然是研究型的,但它是一个 ML(虽然不是标准 ML)的例子,它可以做一些与模块相当通用的事情。

关于Monad 和 SML 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com