gpt4 book ai didi

haskell - typeOf 返回类型

转载 作者:行者123 更新时间:2023-12-03 14:59:52 24 4
gpt4 key购买 nike

我将答案扩展到 Haskell setting record field based on field name string?添加通用 getField .我正在使用 gmapQi ,如果遇到的子元素的类型与预期的类型不匹配,我想生成一个错误。我希望错误消息包含遇到的类型的名称以及预期类型的​​名称。该函数如下所示:

{-# LANGUAGE DeriveDataTypeable #-}

import Data.Generics
import Prelude hiding (catch)
import Control.Exception

getField :: (Data r, Typeable v) => Int -> r -> v
getField i r = gmapQi i (e `extQ` id) r
where
e x = error $ "Type mismatch: field " ++ (show i) ++
" :: " ++ (show . typeOf $ x) ++
", not " ++ (show . typeOf $ "???")

---------------------------------------------------------------------------------

data Foo = Foo Int String
deriving(Data, Typeable)

handleErr (ErrorCall msg) = putStrLn $ "Error -- " ++ msg

main = do
let r = Foo 10 "Hello"
catch (print (getField 0 r :: Int)) handleErr
catch (print (getField 0 r :: String)) handleErr
catch (print (getField 1 r :: Int)) handleErr
catch (print (getField 1 r :: String)) handleErr

问题是,我不知道用什么代替 "???"获取 getField 的返回类型函数(即如何从类型签名中具体化 v)。

最佳答案

typeOf从不计算它的参数,所以你可以使用任何表达式,只要它是正确的类型。在这种情况下,结果的类型与 e 的返回类型相同。 , 所以你可以使用 e x .

getField :: (Data r, Typeable v) => Int -> r -> v
getField i r = gmapQi i (e `extQ` id) r
where
e x = error $ "Type mismatch: field " ++ (show i) ++
" :: " ++ (show . typeOf $ x) ++
", not " ++ (show . typeOf $ e x)

这在运行时给出了预期的输出:
10
"Error -- Type mismatch: field 0 :: Int, not [Char]
Error -- Type mismatch: field 1 :: [Char], not Int
"Hello"

关于haskell - typeOf 返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8683836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com