- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想定义什么似乎需要无限类型。
必需:一个函数“eat”,它吃掉除“3”之外的所有参数,“3”返回 3
eat 3 = 3
eat x = eat
所以基本上像“eat (+) Foldl (Just 5) 3”这样的任意表达式的计算结果为 3。但这里的问题是 eat 的类型。那应该是什么?
我最接近正在运行的代码是:
newtype Rec = MakeRec (Int -> Rec)
eat :: Int -> Rec
eat x = MakeRec eat
instance Show Rec where
show _ = "EAT"
这对于“eat 6”有效,但不适用于“eat 6 7”,并且如果我将 (eat 3 = 3) 放入其定义中,则不起作用。
我不确定这在 Haskell 中是否可行。 (用什么论据来证明这是不可能的?)
更新:如下面的解决方案所述,编译时需要类型信息,以便编译器可以知道“eat Foldl 3 Foldl”是否无效。因此,这个问题的精确解决方案是不可能的。
最佳答案
这是不可能的。 Haskell 中明确禁止无限类型(不是数据类型),并且很容易生成需要它们的代码,从而产生错误(例如,尝试 let foo = (42, foo) in foo
)。
当然,您可以使用 newtype
和 data
创建它们,就像您所做的那样,但是您必须在构造函数中显式包装和解开值.
这是一个明确的设计决策:对于无限类型,我们希望编译器拒绝的许多明显错误的表达式必须被允许,并且由于将允许更多的程序,因此许多以前明确类型的程序将被允许类型变得不明确,1需要显式类型注释。因此需要做出权衡:要求您明确了解无限类型的相当罕见的用途,以换取从类型系统获得比我们其他方式更多的帮助。
也就是说,有一种方法可以使用类型类来定义类似于 eat
函数的内容,但只有当您给它 3 时它才能停止:是否给它一个 3 只能在运行时确定,并且类型是在编译时决定的。但是,这里有一个重载值,它既可以是Integer
,也可以是一个仅消耗其参数的函数:
class Eat a where
eat :: a
instance Eat Integer where
eat = 3
instance (Eat r) => Eat (a -> r) where
eat _ = eat
问题是您需要在使用时精确指定类型:
*Main> eat 1 foldr ()
<interactive>:6:1:
Ambiguous type variable `t0' in the constraint:
(Eat t0) arising from a use of `eat'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: eat 1 foldr ()
In an equation for `it': it = eat 1 foldr ()
*Main> eat 1 foldr () :: Integer
3
这是因为 eat 1foldr ()
可以是一个 Integer
,但它也可以是另一个函数,就像我们使用 eat 1
一样> 和 eat 1foldr
作为同一表达式中的函数。同样,我们可以获得灵活的类型,但必须明确指定我们想要返回的类型。
1 考虑类型类重载,例如重载的数字文字(42
可以是 Num
实例的任何类型)。
关于haskell - 在haskell中故意定义无限类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9566683/
首先是我的对象: public class Group { private final ObservableList sourceList; private final Obser
我有一个 Circle 类和一个 Rectangle 类。我现在想创建一个类 FunnyObject,每个类都由一个圆和两个矩形组成。 如果我这样做: class FunnyObject:public
我正在阅读一篇博文 here关于用 node.js 创建一个刮板并遇到了一些有趣的 javascript,我无法完全理解。这正是我想在我的脚本中使用的东西,但作为一个新手,我不想在不知道它们首先做什么
我不明白为什么在成功之后我为什么看不到脚本中的错误(我用谷歌搜索,它只是给出了关于jquery get脚本成功/错误时错误处理的很多答案)。 如果我使用“any” js脚本执行此操作 $.getScr
我目前正在为我公司正在开发的设备( radio 编码器)开发单元测试。 可以通过 SNMP(仅限 v1)访问各种统计信息,其中您可以获得由于各种原因丢弃的 UDP 数据报的数量。 我希望能够发送一个包
这是一个令人费解的问题。我运行良好的 ASP.NET 3.5 应用程序突然开始出现超时错误... System.Data.SqlClient.SqlException:超时已过。操作完成前超时时间已过
我正在尝试掌握 C++ 内存管理的窍门,并尝试使用无限循环的新语句故意使我的程序崩溃。据我了解,这只会在内存堆上保留越来越多的空间。但是我的程序不会崩溃。在 Windows 任务管理器中监控它,它将使
我是一名优秀的程序员,十分优秀!