我需要制作一个具有通用输入但输出 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/