Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:按类型筛选_Haskell - Fatal编程技术网

Haskell:按类型筛选

Haskell:按类型筛选,haskell,Haskell,对于任何特定类型A: 是否可以编写此函数 filterByType :: a -> Maybe a 它应该马上回来。如果给定类型A的值,则为id,对于任何其他类型的值,则为Nothing 使用GHC Ext、TH、内省等任何方式 注意。由于我对Haskell typesystem的看法被社区批评为过于简单,我觉得有必要声明,这纯粹是学术界对Haskell typesystem局限性的兴趣,没有任何需要解决的特殊任务。您正在寻找 相关问题 范例 {-# LANGUAGE DeriveDat

对于任何特定类型A:

是否可以编写此函数

filterByType :: a -> Maybe a
它应该马上回来。如果给定类型A的值,则为id,对于任何其他类型的值,则为Nothing

使用GHC Ext、TH、内省等任何方式

注意。由于我对Haskell typesystem的看法被社区批评为过于简单,我觉得有必要声明,这纯粹是学术界对Haskell typesystem局限性的兴趣,没有任何需要解决的特殊任务。

您正在寻找

相关问题

范例

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Typeable

data A = A Int deriving (Show, Typeable)
data B = B String deriving (Show, Typeable)

showByType :: Typeable a =>a ->String
showByType x = case (cast x, cast x) of
                 (Just (A y), _) ->"Type A: " ++ show y
                 (_, Just (B z)) ->"Type B: " ++ show z
然后

如果没有可类型化派生,就不存在关于底层类型的信息,您可以执行一些强制转换,如

import Unsafe.Coerce (unsafeCoerce)

filterByType :: a -> Maybe a
filterByType x = if SOMECHECK then Just (unsafeCoerce x) else Nothing
但是,这些信息在哪里

然后,你不能写你的函数,或者我不知道如何写,但是在一些上下文中,二进制内存检查,模板haskell。。。可能是。

您正在寻找的

相关问题

范例

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Typeable

data A = A Int deriving (Show, Typeable)
data B = B String deriving (Show, Typeable)

showByType :: Typeable a =>a ->String
showByType x = case (cast x, cast x) of
                 (Just (A y), _) ->"Type A: " ++ show y
                 (_, Just (B z)) ->"Type B: " ++ show z
然后

如果没有可类型化派生,就不存在关于底层类型的信息,您可以执行一些强制转换,如

import Unsafe.Coerce (unsafeCoerce)

filterByType :: a -> Maybe a
filterByType x = if SOMECHECK then Just (unsafeCoerce x) else Nothing
但是,这些信息在哪里


然后,你不能写你的函数,或者我不知道如何写,但是在一些上下文中,二进制内存检查,模板haskell。。。可能是。

不,您不能编写此函数。在Haskell中,没有类型类约束的值在其类型变量中是参数化的。这意味着我们知道,当在任何特定类型下实例化时,它们的行为必须完全相同;特别是与您的问题相关的,这意味着他们无法检查其类型参数

这种设计意味着所有类型都可以在运行时擦除,GHC实际上就是这样做的。因此,即使走出Haskell qua Haskell,不安全的技巧也无法帮助您,因为运行时表示也有点参数化

如果你想要这样的东西,使用的操作是一个很好的方法


用seq对某些细节进行模化。

不,您不能编写此函数。在Haskell中,没有类型类约束的值在其类型变量中是参数化的。这意味着我们知道,当在任何特定类型下实例化时,它们的行为必须完全相同;特别是与您的问题相关的,这意味着他们无法检查其类型参数

这种设计意味着所有类型都可以在运行时擦除,GHC实际上就是这样做的。因此,即使走出Haskell qua Haskell,不安全的技巧也无法帮助您,因为运行时表示也有点参数化

如果你想要这样的东西,使用的操作是一个很好的方法


用seq对一些细节进行模化。

类型为A的函数->可能A是微不足道的。只是。函数filterByType::A->可能b是不可能的

这是因为一旦编译完程序,a和b就消失了。Haskell中根本没有运行时类型信息

但是,如另一个答案中所述,您可以编写一个函数:

cast :: (Typeable a, Typeable b) => a -> Maybe b
之所以可以编写此函数,是因为约束Typeable a告诉编译器,在调用此函数的任何地方,都要传递由Typeable指定的值的运行时字典。这些都是有用的操作,可以建立和分解大量的Haskell类型。编译器在这方面非常聪明,几乎可以为您使用函数的任何类型传入正确的字典

但是,如果没有这个运行时字典,您就什么都做不了。如果没有Typeable的约束,就无法获得运行时字典


除此之外,如果你不介意我问你,你到底想要这个函数做什么?在Haskell中,按类型过滤实际上并不有用,因此如果您试图这样做,则可能是试图以错误的方式解决问题。

类型a->Maybe a的函数很简单。只是。函数filterByType::A->可能b是不可能的

这是因为一旦编译完程序,a和b就消失了。Haskell中根本没有运行时类型信息

但是,如另一个答案中所述,您可以编写一个函数:

cast :: (Typeable a, Typeable b) => a -> Maybe b
之所以可以编写此函数,是因为约束Typeable a告诉编译器,在调用此函数的任何地方,都要传递由Typeable指定的值的运行时字典。这些都是有用的操作,可以建立和分解大量的Haskell类型。编译器在这方面非常聪明,几乎可以为您使用函数的任何类型传入正确的字典

但是,如果没有这个运行时字典,您就什么都做不了。如果没有Typeable的约束,就无法获得运行时字典

除此之外,如果你不介意我问你,你到底想要这个函数做什么?在Haskell中,按类型过滤实际上并不有用,因此,如果您试图这样做,您可能正在尝试

以错误的方式解决问题。

仅供参考,您称之为限制,Haskell程序员倾向于将其视为基本功能。我们使用参数等属性对代码进行推理,并且在许多情况下有意限制可以使用它做什么,以保留内部不变量或使用不安全的原语来实现安全的API。例如,请阅读联机提供的“惰性函数状态线程”一文。有关该技术的另一种用法,请参阅反射包中的Data.Reflection。有关使用参数的另一种截然不同的方法,请参阅约束包中的Data.Constraint.Forall阅读GitHub上的最新版本,因为它最近更改了很多。至于推理,参数自动确保函子和可遍历实例的某些方面的正确性,确保类型对齐序列上的函数正确地保持顺序,假设你真的想要一个类型,比如a->也许是a。那么,如果你允许自己在a上添加一个typeclass约束,这是很有可能的。但我怀疑,这一系列问题来自于对关键字class的解释,就好像它与类的面向对象概念有关一样——事实并非如此。@DanielWagner,是的,如果我们允许添加约束,而不需要其他任何东西,那么可键入a将是最明智的解决方案。我理解OOP类和类型类之间的区别。我不明白的是Antal和你在回答中说了什么——类型和类型类解析在GHC中是如何工作的。为了让自己更清楚,我问了这些问题。我对结果很满意,因为现在我对这个主题有了更好的理解。仅供参考,您所谓的限制,Haskell程序员倾向于将其视为基本功能。我们使用参数等属性对代码进行推理,并且在许多情况下有意限制可以使用它做什么,以保留内部不变量或使用不安全的原语来实现安全的API。例如,请阅读联机提供的“惰性函数状态线程”一文。有关该技术的另一种用法,请参阅反射包中的Data.Reflection。有关使用参数的另一种截然不同的方法,请参阅约束包中的Data.Constraint.Forall阅读GitHub上的最新版本,因为它最近更改了很多。至于推理,参数自动确保函子和可遍历实例的某些方面的正确性,确保类型对齐序列上的函数正确地保持顺序,假设你真的想要一个类型,比如a->也许是a。那么,如果你允许自己在a上添加一个typeclass约束,这是很有可能的。但我怀疑,这一系列问题来自于对关键字class的解释,就好像它与类的面向对象概念有关一样——事实并非如此。@DanielWagner,是的,如果我们允许添加约束,而不需要其他任何东西,那么可键入a将是最明智的解决方案。我理解OOP类和类型类之间的区别。我不明白的是Antal和你在回答中说了什么——类型和类型类解析在GHC中是如何工作的。为了让自己更清楚,我问了这些问题。我对结果很满意,因为现在我对这个主题有了更好的理解。是否可以不使用a上可键入的约束?这个函数可以接受所有类型吗?@SergeyMitskevich不,以安全的方式不安全?SergeyMitskevich抱歉,我不确定我应该在eqT源代码中查看什么。你能不能用一个带有请求类型签名的函数的工作示例来更新答案,并解释为什么它不安全,我会将它标记为已接受。谢谢是否可以不在a上键入约束?这个函数可以接受所有类型吗?@SergeyMitskevich不,以安全的方式不安全?SergeyMitskevich抱歉,我不确定我应该在eqT源代码中查看什么。你能不能用一个带有请求类型签名的函数的工作示例来更新答案,并解释为什么它不安全,我会将它标记为已接受。谢谢类型A->maybea A的函数是微不足道的。请提供将仅返回的此函数的示例。我会把你的答案标记为已接受。请不要限制输入参数。在Haskell中,按类型过滤实际上并不有用——目前公认的答案是,在Haskell中不可能做到这一点,不管您觉得它有用还是无用。。。我什么都不想要,我觉得有趣的只是Haskell类型系统中合理的砖墙。类型A->可能A的函数很简单。请提供将仅返回的此函数的示例。我会把你的答案标记为已接受。请不要限制输入参数。在Haskell中,按类型过滤实际上并不有用——目前公认的答案是,在Haskell中不可能做到这一点,如果 我不觉得它有用或无用。。。我什么都不想要,我觉得有趣的只是Haskell类型系统中的这堵合理的砖墙。