Haskell循环通过自定义类型

Haskell循环通过自定义类型,haskell,Haskell,如果我有以下自定义类型: type MyType = String -> Bool single :: Char -> MyType concat :: MyType -> MyType -> MyType 以及: 是否可以循环使用var并查看concat和single被调用了多少次?不,没有 var的类型为MyType=String->Bool,因此它是一个函数。使用函数唯一能做的就是调用它。调用var将导致true或false,因为其结果类型是Bool。因此,这还不

如果我有以下自定义类型:

type MyType = String -> Bool
single :: Char -> MyType
concat :: MyType -> MyType -> MyType
以及:

是否可以循环使用var并查看concat和single被调用了多少次?

不,没有

var
的类型为
MyType=String->Bool
,因此它是一个函数。使用函数唯一能做的就是调用它。调用
var
将导致
true
false
,因为其结果类型是
Bool
。因此,这还不足以对您想要的信息进行编码。

不,没有


var
的类型为
MyType=String->Bool
,因此它是一个函数。使用函数唯一能做的就是调用它。调用
var
将导致
true
false
,因为其结果类型是
Bool
。因此,这还不足以编码您想要的信息。

var
是一个函数,您如何建议“循环”函数?是否要检查函数的定义?代码反射并不是Haskell的标准,也不是特别容易。但是,您可以编写一个
data MyType
,其中的字段表示调用
concat
single
的次数,然后在这两个函数的定义中,只需将各自的字段增加1。或者,您可以制作一个ADT来表示结构,稍后解释:
data Expr=Lit MyType | Concat Expr Expr | Single Char
。然后,您可以检查结构以计算使用
Concat
的次数。@bheklillr感谢您的评论。我知道使用ADT是有效的,因为我已经尝试过了。我只是想知道,如果我改用自定义类型,可以应用类似的技巧。你不能用
类型MyType=String->Bool
来实现。只是没有真正的方法来检查函数的定义。您的类型和函数必须显式处理此操作。我想知道您是否喜欢逻辑语言。Haskell只擅长解一类非常有限的方程,除了一些疯狂的系统恶作剧之外,它非常希望你告诉它如何完成它的工作。
var
是一个函数,你如何建议你“循环”一个函数?是否要检查函数的定义?代码反射并不是Haskell的标准,也不是特别容易。但是,您可以编写一个
data MyType
,其中的字段表示调用
concat
single
的次数,然后在这两个函数的定义中,只需将各自的字段增加1。或者,您可以制作一个ADT来表示结构,稍后解释:
data Expr=Lit MyType | Concat Expr Expr | Single Char
。然后,您可以检查结构以计算使用
Concat
的次数。@bheklillr感谢您的评论。我知道使用ADT是有效的,因为我已经尝试过了。我只是想知道,如果我改用自定义类型,可以应用类似的技巧。你不能用
类型MyType=String->Bool
来实现。只是没有真正的方法来检查函数的定义。您的类型和函数必须显式处理此操作。我想知道您是否喜欢逻辑语言。Haskell只擅长解一类非常有限的方程,除了一些疯狂的类型系统骗局外,它非常希望你告诉它如何工作。谢谢你的回复。如果不能做到这一点,我怎么可能实现编辑中描述的我想要的?@xcoder这很简单。制作一个从中生成字符串的函数,如下所示:
toStr::MyType->string;toStr(单个a)=[a];toStr(Concat a b)=toStr a++toStr b
。然后将字符串与它进行比较!谢谢你的回复。如果不能做到这一点,我怎么可能实现编辑中描述的我想要的?@xcoder这很简单。制作一个从中生成字符串的函数,如下所示:
toStr::MyType->string;toStr(单个a)=[a];toStr(Concat a b)=toStr a++toStr b
。然后将字符串与它进行比较!
var :: MyType
var = concat (concat (single 'A') (single 'B')) (single 'C')