首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PolyML函数和类型

PolyML函数和类型
EN

Stack Overflow用户
提问于 2016-11-24 19:24:51
回答 2查看 234关注 0票数 3

..。一对函数tofun : int -> ('a -> 'a)fromfun : ('a -> 'a) -> int,使得(fromfun o tofun) n为每个n : int计算为n

有谁能向我解释这到底是想要什么吗?我正在寻找更多的解释,而不是一个实际的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-24 20:11:20

这里要求的是:

1)高阶函数tofun,当给定一个整数时,它返回一个多态函数,该函数具有'a->'a类型,这意味着它可以应用于任何类型的值,返回相同类型的值。这种职能的一个例子是:

代码语言:javascript
复制
- fun id x = x;
val id = fn : 'a -> 'a

例如,id "cat" = "cat"id () = ()。后一个值是类型单位,它是一个只有一个值的类型。请注意,从unitunit只有一个总计函数(即id或类似的东西)。这突出了定义tofun的困难:它返回一个类型为'a -> 'a的函数,除了标识函数之外,很难想到其他函数。另一方面,这类函数可能无法终止或引发错误,并且仍然具有'a -> 'a类型。

2) fromfun应该接受一个'a ->'a类型的函数并返回一个整数。因此,例如,fromfun id可能计算为0(或者如果您想变得棘手,它可能永远不会终止,或者可能会引发错误)

3)这些应该是彼此的逆词,因此,例如fromfun (tofun 5)需要计算为5。

从直觉上看,在一种足够纯粹的功能语言中,这是不可能的。如果在SML中可能的话,我的猜测是使用SML的一些不纯特性(允许副作用)来违反引用透明性。或者,技巧可能包括引发和处理错误(这也是SML的一个不纯特性)。如果您找到了一个在SML中有效的答案,那么看看它是否可以被翻译成令人讨厌的纯函数语言Haskell是很有趣的。我猜是不会翻译的。

票数 2
EN

Stack Overflow用户

发布于 2016-11-25 15:07:00

您可以设计以下属性:

代码语言:javascript
复制
fun prop_inverse f g n = (f o g) n = n

对于tofunfromfun的定义,

代码语言:javascript
复制
fun tofun n = ...
fun fromfun f = ...

您可以测试它们是否维护了该属性:

代码语言:javascript
复制
val prop_test_1 =
    List.all
      (fn i => prop_inverse fromfun tofun i handle _ => false)
      [0, ~1, 1, valOf Int.maxInt, valOf Int.minInt]

正如约翰所建议的那样,这些功能一定是不纯的。我也会例外地去。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40793384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档