Haskell,将泛型与 Char 进行比较

标签 haskell generics

我需要制作一个具有通用输入但输出 bool 值的 Haskell 函数,具体取决于通用是否与某些数字/字符匹配:

checkFunct :: a -> Bool
checkFunct x = (elem x ['a','b','c'])

这是行不通的,因为您无法将 Char 与泛型进行比较。我已经找了很久了,而且我是 Haskell 的新手,所以不知道如何修复它。 注意:它特别指出输入必须是 -> Bool

例如这段代码完美运行:

checkFunct :: Char -> String
p x = elem x ["a","b","c"]

但是我需要“a”而不是 Char。抱歉造成任何困惑。 (显然 'a' 不是泛型)

最佳答案

对该问题的一种可能解释是:您希望函数告诉参数是否为Char 并且在列表中。你不能单独使用签名 a -> Bool 来做到这一点,因为类型信息对函数不可用,但是你可以明确地要求类型信息:a dedicated class for this .

import Data.Typeable

checkFunct :: Typeable a => a -> Bool
checkFunct x = case cast x of
    Just xc  -> xc `elem` ['a','b','c']
    Nothing  -> False

(请注意,与许多其他语言不同,cast 并不真正转换类型,它只是匹配它是否首先是目标类型。)

*Main> checkFunct 'b'
True
*Main> checkFunct 'f'
False
*Main> checkFunct 37
False
*Main> checkFunct "a"
False

关于Haskell,将泛型与 Char 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64703867/

相关文章:

java - 通用构造函数的好处

string - 在 Haskell 中,如何修剪字符串开头和结尾的空格?

windows - 如何防止控制台窗口在 ghc 应用程序中关闭?

c# - 如何在 C# 中将泛型对象分配给非泛型引用

java - 为什么 Java 不使用现有的类语言规范语法来进行泛型类型规范?

android - Kotlin 泛型属性问题

java - 泛型将子类添加到数组

Haskell 动态数据类型更改

haskell - GADT 中的递归替换

haskell - 如何将这个 python 翻译成 Haskell?